1

我想用 xib 初始化一个视图。那是一个 UIView。所以我有一个 xib 和一个 UIView 子类,下面粘贴了初始化代码(initWitFrame nibName)。创建视图时,我将 xib 名称从视图控制器提供给初始化代码。

SubclassUIView *view = [[SubclassUIView alloc]initWithFrame:self.view.bounds nibName:@"xibName"];

我在正确的轨道上吗?到目前为止,xib 的内容并未随视图一起加载。

顺便说一下,xib 中的主视图设置为我的 UIView 子类的类类型。

- (id)initWithFrame:(CGRect)frame nibName:(NSString*)nibName
{
    self = [super initWithFrame:frame];
    if (self)
    {
        [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
        [self addSubview:self.view];
    }
    return self;
}
4

2 回答 2

9

从 NSBundle 返回的是一个 NSArray(视觉控件,主要是 UIViews)。Appart的代码似乎是正确的。看一个有效的例子:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"TestView" 
                                                          owner:self 
                                                        options:nil];

        UIView* mainView = (UIView*)[nibViews objectAtIndex:0];

        [self addSubview:mainView];
    }
    return self;
}
于 2013-02-22T12:06:50.733 回答
0

@Mike M:这种行为可能会导致随机崩溃。有时一个 NSApplication 对象会是 firstObject -> crash

苹果文档: https ://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html

“无法保证 nib 加载代码调用对象的 awakeFromNib 方法的顺序。在 OS X 中,Cocoa 尝试最后调用 File's Owner 的 awakeFromNib 方法,但不保证该行为。如果您需要在在加载 nib 文件时,最合适的时间是在您的 nib-loading 调用返回之后。此时,所有对象都已创建、初始化并准备好使用。

于 2014-08-13T18:09:58.423 回答