UIViewController init vs initWithNibName:bundle:

在我的应用程序中,我推一个视图控制器(一个UITableViewController),也有一个属性/sockets引用UITableViewCell。 看来,创build控制器:

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

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

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

但我没有真正明白为什么它的工作,从文档看来init应该足以加载相关的nib文件(PreferencesController.xib)。

PreferencesController这个名字似乎有些神奇。 我刚刚有完全相同的问题。 把我的类(和xib)重命名为别的东西解决了这个问题。

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

界面生成器中的文件所有者是什么? 可以通过更改此值来修改默认行为。

你必须重写initWithNibName:bundle:而不是init因为这是“指定的初始化程序”。 从Nib文件加载时,这是正在调用的创build者消息。

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

资源

  • 你可以看到这是在它的父类UIViewController文档中的指定初始值设定项。
  • 您可以在Apple的文档中了解有关指定初始值设定项的更多信息
  • 一个相关的SO问题 ,我了解到这一点。