initWithNibName VS NSBundle的loadNibNamed

时间:2009-11-09 21:58:15

标签: iphone objective-c cocoa-touch uitableview nib

我注意到有两种不同的加载nib / xib文件的方法:

  1. 通过UIView的initWithNibName:bundle:方法
  2. NSBundle的loadNibNamed:owner:options:方法。
  3. 有人可以解释这两者之间的差异,以及何时使用其中一种以及在什么情况下更合适?

    例如,如果我从tableView:viewForHeaderInSection:方法中的nib文件加载自定义表节标题视图,我将使用哪一个?

    或者,如果我从nib文件加载自定义表格视图单元格,我会使用哪一个?

2 个答案:

答案 0 :(得分:11)

NSBundle的方法是用于取消归档NIB的通用API。他们做实际工作(与NSNib一起)。

另一方面,

UIViewController的{​​{1}}是一种初始化视图控制器的方法,该视图控制器(可能)从笔尖加载其视图。该方法本身不会加载笔尖,只需记下名称即可。在请求视图时,控制器会懒惰地加载笔尖。

我不知道initWithNibName:bundle:中的任何笔尖加载。

答案 1 :(得分:8)

如果标题的视图控制器包含nib文件中任何字段的IBOutlets,最好加载nib 文件而不是调用initWithNib。 在头文件的视图控制器中,修改启动语句如下。默认语句被注释掉 通过这样做,您将能够使用IBoutlets访问nib文件中的字段。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    //self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    // Custom initialization.
    if ([[NSBundle mainBundle] loadNibNamed:@"NibFile" owner:self options:nil]) {

    }

    return self;
}