为什么我从未调用过UIViewController的指定初始值设定项?

时间:2010-10-21 11:43:42

标签: iphone ipad

我使用基于视图的应用模板创建了一个新的Xcode项目。在视图控制器的.m中,我覆盖了这个:

// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization

        NSLog(@"initWithNibName...");
    }
    return self;
}


- (id)init {
    NSLog(@"initWithNibName...");
    return [super init];
}

然而,我从来没有得到那个NSLog。这也是我从其他项目中获得的经验。永远不会调用此方法。甚至没有 - 来自NSObject。

View Controller在XIB文件中创建。怎么可能,Nib Loading System在没有任何初始化的情况下实例化这个类?

为什么呢?什么是替代而不是-loadView和-viewDidLoad?

远离XIB文件的另一个重要原因是什么?

3 个答案:

答案 0 :(得分:9)

来自iOS Resource Programming Guide

  

在iPhone OS中,使用initWithCoder:方法初始化符合NSCoding协议的任何对象。这包括UIViewUIViewController的所有子类,无论它们是默认Interface Builder库的一部分还是您定义的自定义类。

以这种方式思考:在Interface Builder中首次创建视图控制器时,将调用指定的初始化程序。然后,当您保存nib文件时,视图控制器实例将存储在该文件中。稍后,当加载nib时,将从nib重新创建实例。

由于它是第一次重新创建而不是创建,因此使用了不同的初始化方法。此方法(-initWithCoder:)使用nib文件中的值恢复对象的状态,该值可包括超出指定初始值设置的属性的设置。这种机制依赖于NSCoding协议,它允许它一般用于许多不同的类。

答案 1 :(得分:1)

你可以使用 - awakeFromNib。 只有在代码中执行此操作时才会调用init。

答案 2 :(得分:0)

您是否已将MainWindow的委托设置为appDelegate ..? 在AppDelegate和UIApplicationDelegate Methode中实施applicationDidFinishLaunching,尝试initWithNibName。 这样就可以了。