2013-02-11 99 views
1

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

回答

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

@Mike L: 此行为可导致随机崩溃。有时,一个的NSApplication对象将是firstObject - >崩溃

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

“在笔尖加载代码调用对象的awakeFromNib方法的顺序是不能保证在OS X,可可尝试。最后调用文件所有者的awakeFromNib方法,但不能保证这种行为如果你需要在加载时进一步配置nib文件中的对象,最合适的时候是在你的nib加载调用返回之后。点,所有的对象都被创建,初始化并准备好使用。“