我什么时候需要调用 - [UIViewController initWithNibName:bundle:]?

wrl*_*lee 6 interface-builder uiviewcontroller designated-initializer ios

在post中使用initWithNibName绝对没有任何改变,他展示了两个使用相同的View Nib定义,在第一种情况下,他只是调用alloc/init而第二种,他指定了initWithNibName.

所以,虽然这总是有效的:

MyViewController *vctrlr = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

以下适用于我继承的所有View Controllers,但不是我的!

TheirViewController *vctrlr = [[TheirViewController alloc] init]; [self.navigationController pushViewController:vctrlr animated:YES]; [vctrlr release];

iOS编程新手,我继承了一些代码.所有View Controllers的视图都在IB中定义,但这些视图控制器的分配/初始化创建不一致.我创建了一个新的View Controller和XIB,但它不起作用,除非我使用initWithNibName(当我将视图控制器推到Nav Controller上时崩溃).我不知道我的视图控制器与其他控制器有什么不同...任何提示?我能够删除应用程序中除我的所有其他视图控制器的initNibName用法.

bne*_*ely 1

您可以将任何字符串名称传递给initWithNibName:. 您不仅限于initWithNibName:@"MyClassName"在您的班级被调用时调用MyClassName。它可能是initWithNibName:@"MyClassNameAlternateLayout"

如果您需要根据应用程序需要执行的操作加载不同的笔尖,这将变得非常有用。虽然我尝试尽可能为每个设备类别(iPhone 或 iPad)每个视图控制器一个笔尖,以使开发和维护更简单,但我可以理解开发人员有时是否希望提供不同的布局或不同的功能。

另一个重要的一点是initWithNibName:bundle:是 的指定初始值设定项UIViewController。当您调用 时-[[UIViewController alloc] init],theninitWithNibName:bundle:会在幕后被调用。您可以使用符号断点来验证这一点。换句话说,如果您只是想要默认行为,则期望您可以调用-[[UIViewController alloc] init]并且将隐式调用指定的初始值设定项。

但是,如果您调用-[[UIViewController alloc] init]但没有获得预期的行为,则可能是您的 UIViewController 子类实现- (id)init不正确。实现应该类似于以下两个示例之一:

- (id)init
{
    self = [super init];
    if (self) {
        // custom initialization
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

或者

- (id)init
{
    NSString *aNibName = @"WhateverYouWant";
    NSBundle *aBundle = [NSBundle mainBundle]; // or whatever bundle you want
    self = [self initWithNibName:aNibName bundle:aBundle];
    if (self) {
        // custom initialization
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)