从nib加载时未调用UIViewController子类init

Joh*_*lph 6 model-view-controller objective-c interface-builder uikit nib

我尝试覆盖UIViewController子类的默认initWithNibName指定初始化程序,如下所示:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // Custom initialization
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我还在头文件中包含了它的定义.但是,当我的Application Delegate nib加载viewcontroller时,不调用初始化程序,只调用-viewDidLoad.

那个nib magic如何实例化我的视图控制器呢?为什么所有的XCode模板都说明了

//指定的初始化程序.如果以编程方式创建控制器并希望执行不适合viewDidLoad的自定义,则覆盖.

它是否正确当从另一个nib加载viewcontroller时,我的initWithNibName没有被调用?

new*_*cct 17

您需要将初始化代码放在awakeFromNib方法中,以便在从Nib加载时运行它.Nib文件包含它包含的对象的存档版本,因此原则上它们不需要再次初始化.

  • 另外,`-initWithCoder:`是从nib实例化时调用的init方法. (5认同)
  • 为什么-awakeFromNib而不是-viewDidLoad? (2认同)
  • 一些nib没有viewDidLoad方法,比如UIView (2认同)