如何将nib (.xib)文件与UIView相关联?

20

我有一个UIView的子类“s”,我想在s上放置一些按钮和标签。如何将我的UIView子类与nib文件关联起来?

2个回答

28
  1. 在界面生成器(Interface Builder)中,使用视图模板创建一个新的xib文件。
    • 在xib文件中的对象列表中,点击视图(你还应该看到“文件所有者”和“第一响应者”)。
    • 按下Cmd-4打开检查器的标识面板。
    • 在“类名”字段中键入你的类名并按回车。

现在你可以向其中拖入按钮。要从代码中访问这个nib文件,使用 -[NSBundle loadNibNamed:owner:options:] 方法。你的视图应该是返回的数组中的第一个对象。


我正在尝试做相同的事情-您知道在此处应该使用哪个类名称作为(a)父UIControllerView和(b)自定义UIView本身的类名称吗?我注意到我的代码中两者都使用了我的自定义UIView类名称,但这会导致递归调用我的自定义UIView init方法。也就是说,我有(a)在使用我的自定义视图的父UIControllerView中,在它的XIB中我使用了一个UIView,我将其类名设置为“clockview”,但是(b)在我的实际时钟自定义UIView(不是UIControllerView)XIB文件中,我做了同样的事情,并将类名设置为“clockview”。 - Greg
@Colin 我们真的需要将“文件所有者(File's Owner)”设置为自定义UIView类吗?我没有看到将其设置为“UIView”或“myCustomView”有任何区别。在这种情况下,“文件所有者”的目的是什么? - pixelfreak
我想在多个地方使用带有nib的UIView。有没有一种方法可以避免每次都连接IBOutlets? - jowie
在XCode 4.5中,我需要清理并关闭XCode才能使UIView类出现在“自定义类”列表中,其中您需要链接的属性存在。 - whyoz
有人可以分享一下如何正确地加载和显示UIView吗?谢谢。 - Zennichimaro

3
在我的情况下,我不希望我的视图控制器了解来自我的视图的.xib的IBOutlets。我希望我的视图子类拥有IBOutlets。不幸的是,UIView没有一个“initWithNibName:”方法,所以我创建了自己的类别。
这是我做的:
  • 在IB中,点击主UIView,在Identity Inspector中将类设置为您的子类
  • 在IB中,点击文件所有者,在Identity Inspector中将类设置为您的子类
  • 使用您的新类别方法“initWithNibName:”来实例化您的视图。
这是我创建的类别:
- (instancetype)initWithNibName:(NSString *)nibName
{
    NSArray *arrayOfViews = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
    if (arrayOfViews.count < 1) {
        return nil;
    }

    self = arrayOfViews[0];

    return self;
}

受到这篇文章的启发。

需要注意的是,到目前为止,框架会自动调整,所以不像文章中的代码,我还没有必要明确设置框架。 此外,与文章中的代码不同,我需要设置owner:self,以便正确连接IBOutlets。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接