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

标签 ios uiviewcontroller interface-builder designated-initializer

在帖子中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 释放];

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

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

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

最佳答案

您可以将任何字符串名称传递给 initWithNibName:。当您的类被称为 MyClassName 时,您不仅限于调用 initWithNibName:@"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/

相关文章:

android - iOS:类似 Android 布局的相对定位

ios - 将按钮直接放置在标签的右侧(Swift)

iphone - -JSONValue 失败。错误跟踪为 : in Google currency converter in iPhone

ios - 在 tableViewCell 中设置字符串数组

ios - 禁用屏幕顶部的 UIScrollView 弹跳

iOS 9 Segue 导致应用卡住(没有崩溃或错误抛出)

ios - 如何从另一个类访问 UIViewController 上的 IBoutlet?

objective-c - 如何在项目中查找使用特定类的NIB?

ios - 使用 iOS 从 bundle 中加载图像

objective-c - 用动画交换 rootViewController