有人可以让我理解下面代码片段之间的区别。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
和
-(id)initWithCoder:(NSCoder *)decoder
Apple文档说当从故事板实例化视图控制器时使用initWithCoder。请有人可以使用initWithCoder方法编写示例代码来启动视图控制器。
我实际上是ios编程的新手,所以只是想知道其中的区别。
谢谢!
答案 0 :(得分:0)
最重要的区别是,当从故事板中提取VC时会调用initWithCoder:而initWithNibName则不会。出于所有意图和目的,您可以忽略WithCoder:
位(除了将其传递给[super initWithCoder:decoder]
)。该方法是Cocoa中对象归档/序列化库的一部分,当需要对实例化对象进行归档/取消归档时使用它们。
以这种方式思考它会有所帮助:当您在Xcode 中构建应用程序时,ViewController实际上已实例化并初始化,然后将存档到您的故事板。然后在运行时,故事板被视为存档,您的工作更像是“从存档重新初始化”而不是传统的初始化。
答案 1 :(得分:0)
无论何时从IB(nib或故事板)创建它,它都会被调用,但是当对象被存档或序列化时也会被调用(查看NSUnarchiver)。
就实施而言,你可以像对待它一样对待它 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 但是,您只需确保在调用时将额外参数传递给超类:
- (id)initWithCoder:(NSCoder*) coder
{
self = [super initWithCoder: coder];
if (self) {
// do your setup here.
}
return self;
}
您可能永远不会调用它,但是如果您使用嵌入在nib中的自定义类/视图,那么界面构建器将会出现。如果您在代码中初始化它,则应使用initWithNibName。