使用xib初始化视图

时间:2013-02-11 02:49:44

标签: objective-c xib nib

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

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;
}

2 个答案:

答案 0 :(得分:9)

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

- (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;
}

答案 1 :(得分:0)

@Mike M: 此行为可能导致随机崩溃。有时NSApplication对象将是firstObject - >碰撞

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

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