Ios UIViewController初始化与initWithNibName:bundle:

Ios UIViewController初始化与initWithNibName:bundle:,ios,uitableview,uiviewcontroller,init,Ios,Uitableview,Uiviewcontroller,Init,在我的应用程序中,我正在推送一个视图控制器(UITableViewController),它还有一个引用UITableViewCell的属性/出口。似乎正在使用以下命令创建控制器: PreferencesController *pController = [[PreferencesController alloc] init]; 不在xib文件中为UITableViewCell创建对象,因此出口为空,因此表加载生成异常。 我用以下方法解决了这个问题: PreferencesController

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

PreferencesController *pController = [[PreferencesController alloc] init];
不在xib文件中为UITableViewCell创建对象,因此出口为空,因此表加载生成异常。 我用以下方法解决了这个问题:

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

但我并没有真正理解它为什么会起作用,因为从文档中可以看出,init应该足以加载相关的nib文件(PreferencesController.xib)。

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


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

名称
首选项控制器
似乎有一些神奇之处。我也有同样的问题。将我的类(和xib)重命名为其他类解决了问题。

您必须用nibName:bundle:
替代
init
,因为这是“指定的初始值设定项”。当您从Nib文件加载此消息时,这是正在调用的创建者消息

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

  • 您可以看到,这是其父类中指定的初始值设定项
  • 你可以了解更多关于
  • A我在那里学到了这一点

PreferencesController.xib的文件所有者类是PreferencesController,而LibraryMenuController.xib的文件所有者类是LibraryMenuController。
关键是,没有通过文件所有者的view属性链接的xib中的对象不使用init方法加载,但需要initWithNibName。。