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)”?