2012-07-13 78 views
0

有人可以讓我理解下面的代碼片段之間的區別。實例從一個故事板使用的initWithCoder視圖控制器時不同類型的initWithNibName

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

    } 
    return self; 
} 

而且

-(id)initWithCoder:(NSCoder *)decoder 

蘋果文件說。請有人使用initWithCoder方法編寫示例代碼來啓動視圖控制器。

我實際上是新來的ios編程,所以只是想知道區別。

謝謝!

回答

0

最重要的區別是initWithCoder:在從故事板拉出VC時調用,而initWithNibName不是。對於所有的意圖和目的,您可以忽略WithCoder:位(除了將它傳遞給[super initWithCoder:decoder])。該方法是Cocoa中的對象歸檔/序列化庫的一部分,當實例化對象需要歸檔/取消歸檔時,可以使用它們。

它有助於這樣設想一下:你的ViewController實際實例化和當你建立你的應用程序在Xcode初始化,然後存檔到故事板。然後在運行時,故事板被視爲一個存檔,而您的工作更像是「從存檔重新初始化」而不是傳統的init。

0

它通常從IB(即筆尖或故事板)創建時調用,但當對象歸檔或序列化時(請參閱NSUnarchiver)也會調用它。

至於落實它去,你可以把它當作你會與 - (ID)initWithNibName:(的NSString *)nibNameOrNil包(一個NSBundle *)nibBundleOrNil 但是,你只需要確保你通過給超類的額外的參數,當你把它叫做:

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

你可能永遠不會調用此方法,但接口生成器將如果您使用嵌入在筆尖的自定義類/視圖。如果你在代碼中初始化它,你應該使用initWithNibName。