我使用基于视图的应用模板创建了一个新的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文件的另一个重要原因是什么?
答案 0 :(得分:9)
来自iOS Resource Programming Guide
在iPhone OS中,使用
initWithCoder:
方法初始化符合NSCoding协议的任何对象。这包括UIView
和UIViewController
的所有子类,无论它们是默认Interface Builder库的一部分还是您定义的自定义类。
以这种方式思考:在Interface Builder中首次创建视图控制器时,将调用指定的初始化程序。然后,当您保存nib文件时,视图控制器实例将存储在该文件中。稍后,当加载nib时,将从nib重新创建实例。
由于它是第一次重新创建而不是创建,因此使用了不同的初始化方法。此方法(-initWithCoder:
)使用nib文件中的值恢复对象的状态,该值可包括超出指定初始值设置的属性的设置。这种机制依赖于NSCoding
协议,它允许它一般用于许多不同的类。
答案 1 :(得分:1)
你可以使用 - awakeFromNib。 只有在代码中执行此操作时才会调用init。
答案 2 :(得分:0)
您是否已将MainWindow的委托设置为appDelegate ..?
在AppDelegate和UIApplicationDelegate
Methode中实施applicationDidFinishLaunching
,尝试initWithNibName
。
这样就可以了。