不同类型的initWithNibName

时间:2012-07-13 23:18:41

标签: iphone objective-c ios xcode interface-builder

有人可以让我理解下面代码片段之间的区别。

- (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编程的新手,所以只是想知道其中的区别。

谢谢!

2 个答案:

答案 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。