UIViewController init 与 initWithNibName:bundle:

Posted

技术标签:

【中文标题】UIViewController init 与 initWithNibName:bundle:【英文标题】:UIViewController init vs initWithNibName:bundle: 【发布时间】:2011-05-31 13:33:56 【问题描述】:

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

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

不会为xib文件中的UITableViewCell创建对象,因此outlet为null,因此表加载会产生异常。 我解决了这个问题:

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

但我并没有真正明白它为什么会起作用,因为从文档看来,init 似乎足以加载相关的 nib 文件 (PreferencesController.xib)。

【问题讨论】:

【参考方案1】:

PreferencesController 这个名字似乎有些神奇。我刚刚遇到了完全相同的问题。将我的课程(和 xib)重命名为其他名称解决了这个问题。

【讨论】:

【参考方案2】:

编辑:我错了,如果 nib 文件与控制器命名相同,则应该使用 alloc init 自动加载。

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

【讨论】:

PreferencesController.xib 的文件所有者类是 PreferencesController,LibraryMenuController.xib 是 LibraryMenuController.. 关键是 xib 中未由文件所有者中的视图属性链接的对象未加载使用 init 方法,但需要 initWithNibName ..【参考方案3】:

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

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

资源

可以看到这是其父类UIViewController docs中指定的初始化器。 您可以了解更多关于designated initializers in Apple's docs related SO question 在那里我学到了这一点。

【讨论】:

以上是关于UIViewController init 与 initWithNibName:bundle:的主要内容,如果未能解决你的问题,请参考以下文章

UIViewController init 方法中的隐式解包选项

如何为我在 Swift 中以编程方式创建的 UIViewController 子类创建 init?

在 init 方法完成之前调用 UIViewController viewDidLoad

什么时候在 UIView 或 UIViewController 上调用“required init?(coder aDecoder: NSCoder)”?

iOS5 Storyboard UIViewController 的故事板调用了哪个init方法?

iOS,视图控制器相关(UIViewController)