菜鸟教程小白 发表于 2022-12-13 01:08:28

iphone - iOS - 将自定义 UIView 放在 View Controller 中


                                            <p><p>我的 iOS 应用有一个 Root ViewController ,我想在运行时向它添加一些自定义 <code>UIView</code>。我称这些自定义 View 小部件是因为它们很小,除了大小、标签文本等基本相同。</p>

<p>我为我的小部件创建了 .h 和 .m 以及 .xib 文件。在我的 Root ViewController<code>viewDidLoad</code> 我这样做:</p>

<pre><code>TestMyView *cell = [[ loadNibNamed:@&#34;TestMyView&#34; owner:self options:nil] objectAtIndex:0];   
;
</code></pre>

<p>它工作正常。但是,我还是想不通:</p>

<ul>
<li>如果我添加 <code>UILabel</code>,为什么会有异常 <code>"[<TestViewController 0x7517210> setValue:forUndefinedKey:]: This class is not key value coding-compliant for key mylabel"</code> mylabel 作为 IBOutlet 到我的自定义 UIView 类 .h 文件。 (我将 UILabel 拖放到 IB 中,然后控制拖动到 .h)创建 View 时我需要更改标签文本。而且我不太明白为什么它提示 TestViewController 而我没有向它添加 IBOutlet,而是我的自定义 View.h 类?</li>
<li>那么我该如何以正确的方式更改标签文本。我不想为我的小部件创建 ViewController ,因为我认为没有必要。我需要创建 5-6 个小部件,所以我需要为它们创建 5-6 个 ViewController ? </li>
<li>我创建小部件时似乎没有调用 initWithCoder?我看到苹果文档库说如果从 nib 文件加载 View ,这个方法会被调用。</li>
</ul>

<p>如果您认为我解释这一点很烂,这是我的项目代码:
<a href="https://dl.dropbox.com/u/43017476/custom.tar.gz" rel="noreferrer noopener nofollow">https://dl.dropbox.com/u/43017476/custom.tar.gz</a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你已经接近了。一些笔记。</p>

<p>1st - 当您从 nip 加载 View 时,“所有者”是具有 nib 引用的属性 (IBOutlets) 的类。那可能是TestMyView 的一个实例。通常,创建自定义 View 并让它加载它自己的 nib(如下图所示)。</p>

<p>2nd - loadNibNamed 返回 NSARRAY,而不是 UIVIEW;所以你会想把你的 View 拉出数组。</p>

<p>以下是创建自定义 View (小部件)的示例:</p>

<pre><code>CGRect frame = CGRectMake(nextLeft, nextTop, tileWidth, tileHeight);
TestMyView *widget = [ initWithFrame:frame andFoo:foo];
[widget setWidgetTappedBlock:^{
    // handle tap for this widget
}];
;
</code></pre>

<p>这是您的自定义 View 实现的一部分:</p>

<pre><code>@implementation TestMyView

- (id)initWithFrame:(CGRect)frame andFoo:(Foo *)foo
{
    self = ;
    if (self) {
      ];
      NSArray *nibObjects=[ loadNibNamed:@&#34;TestMyView&#34; owner:self options:nil];
      ];
      // More initialization code
    }
    return self;
}

@end
</code></pre>

<p>还有界面:</p>

<pre><code>@interface ProductTileView : UIView

@property (nonatomic, weak) IBOutlet UIView *view;
@property (nonatomic, copy) ProductTappedBlock widgetTappedBlock;

- (id)initWithFrame:(CGRect)frame andFoo:(Foo *)foo;

@end
</code></pre>

<p><strong>编辑:</strong>
PS在你的例子中,错误是因为发送给loadNib的所有者是'self',这是你的 ViewController 。您的 ViewController 没有“myLabel”属性,但您的自定义 View 却有。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - iOS - 将自定义 UIView 放在 ViewController 中,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/14911899/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/14911899/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - iOS - 将自定义 UIView 放在 View Controller 中