Using initWithNibName changes absolutely nothing中,他展示了相同的View Nib定义的两种用法,在第一种情况下,他只是调用了alloc/init,而在第二种情况下,他指定了initWithNibName。

因此,尽管这始终有效:
MyViewController *vctrlr = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];[self.navigationController pushViewController:vctrlr animated:YES];[vctrlr release];
以下内容适用于我继承的所有View Controller,但不适用于我!
TheirViewController *vctrlr = [[TheirViewController alloc] init];[self.navigationController pushViewController:vctrlr animated:YES];[vctrlr release];
iOS编程的新手,我继承了一些代码。所有 View Controller 的 View 都在IB中定义,但是这些 View Controller 的分配/初始化创建不一致。我创建了一个新的View Controller和XIB,但是除非使用initWithNibName,否则它将不起作用(将View Controller插入Nav Controller时会崩溃)。我不能说我的 View Controller 与其他 Controller 有何不同...有什么提示吗?我能够删除应用程序中除我之外的所有其他 View Controller 的initNibName用法。

最佳答案

您可以将任何字符串名称传递给initWithNibName:。当您的类称为initWithNibName:@"MyClassName"时,不仅限于调用MyClassName。可能是initWithNibName:@"MyClassNameAlternateLayout"

如果您需要根据应用程序的需要加载不同的 Nib ,这将很有用。虽然我尽可能使每个设备类别(iPhone或iPad)的每个 View Controller 具有一个 Nib ,以简化开发和维护工作,但我仍可以理解开发人员是否希望有时提供不同的布局或不同的功能。

另一个重要的一点是initWithNibName:bundle:UIViewController的指定初始化程序。当您调用-[[UIViewController alloc] init]时,然后会在后台调用initWithNibName:bundle:。您可以使用符号断点进行验证。换句话说,如果您只想要默认行为,则可以调用-[[UIViewController alloc] init],并且将隐式调用指定的初始化程序。

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

- (id)init
{
    self = [super init];
    if (self) {
        // custom initialization
    }
    return self;
}

或者
- (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;
}

关于ios - 什么时候需要调用-[UIViewController initWithNibName :bundle:]?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6132681/

10-11 14:52