UIViewController init vs initWithNibName:bundle:

时间:2011-05-31 13:33:56

标签: ios uitableview uiviewcontroller init

在我的应用程序中,我正在推动一个视图控制器(一个UITableViewController),它还有一个引用UITableViewCell的属性/出口。看来用以下方法创建控制器:

PreferencesController *pController = [[PreferencesController alloc] init];

不会在xib文件中为UITableViewCell创建对象,因此出口为空,因此表加载会生成异常。 我解决了这个问题:

PreferencesController *pController = [[PreferencesController alloc] initWithNibName:@"PreferencesController" bundle:nil];

但我真的不知道为什么它有效,因为从文档中看起来init应该足以加载相关的nib文件(PreferencesController.xib)。

3 个答案:

答案 0 :(得分:4)

名称PreferencesController似乎有些神奇。我刚才遇到了同样的问题。将我的类(和xib)重命名为其他东西可以解决问题。

答案 1 :(得分:3)

编辑:我不正确,如果nib文件的名称与控制器相同,则应自动加载alloc init

Interface Builder中的文件所有者是什么?可以通过更改此值来修改默认行为。

答案 2 :(得分:1)

您必须覆盖initWithNibName:bundle:而不是init,因为这是“指定的初始化程序”。从Nib文件加载时,这是被调用的创建者消息。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // Custom initialization
    }
    return self;
}

<强>资源