0

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

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    // Custom initialization

    }  
    return self; 
}

-(id)initWithCoder:(NSCoder *)decoder

苹果文档说从情节提要中实例化视图控制器时使用 initWithCoder。请有人可以使用 initWithCoder 方法编写示例代码来启动视图控制器。

我实际上是 ios 编程的新手,所以只想知道其中的区别。

谢谢!!

4

2 回答 2

0

最重要的区别是 initWithCoder: 在从情节提要中提取 VC 时调用,而 initWithNibName 则不调用。出于所有意图和目的,您可以忽略该WithCoder:位(将其传递给 除外[super initWithCoder:decoder])。该方法是 Cocoa 中对象归档/序列化库的一部分,在需要对实例化对象进行归档/取消归档时使用它们。

这样想会有所帮助:当您在 Xcode 中构建应用程序时,您的 ViewController 实际上会被实例化和初始化,然后归档到您的 storyboard中。然后在运行时,故事板被视为存档,您的工作更像是“从存档重新初始化”而不是传统的 init。

于 2012-07-13T23:25:05.383 回答
0

它通常在从 IB(笔尖,或从情节提要)创建时被调用,但是当对象被归档或序列化时也会被调用(查看 NSUnarchiver)。

至于实现它,你可以像对待它一样对待它 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 但是,你只需要确保你将额外的参数传递给 super调用它时的类:

- (id)initWithCoder:(NSCoder*) coder
{
    self = [super initWithCoder: coder];
    if (self) {
        // do your setup here.
    }
    return self;
}

您可能永远不会调用它,但如果您使用嵌入在 nib 中的自定义类/视图,界面构建器会调用它。如果你在代码中初始化它,你应该使用 initWithNibName。

于 2012-07-13T23:46:25.640 回答