2013-06-28 63 views
1

我有一個自定義的容器視圖控制器,我從故事板實例化,並且有一堆方法修改了我從storyboard設置插座的子視圖的內容。ViewController之前被調用的自定義init方法viewDidLoad

有很多方法可以實例化這個ViewController,目前我必須確保,但是我實例化它,在開始之前我要麼顯示它,明確地調用loadView,要麼訪問它的.view屬性任何使用其出口的東西(因爲它們都是空指針,直到調用loadView)。

理想情況下,我想提出一個電話loadView.viewViewController單一初始化器的方法來解決這個問題,而不是把呼叫.view在一堆不同的地方,我的初始化ViewController來自。

UIViewController類是否有指定的初始化程序?如果沒有,我需要使用我的自定義初始化邏輯修改哪些方法,以確保在我的ViewController初始化時調用它,而不管它是什麼?

+0

UIViewController文檔明確指出'loadView'不應該直接調用。 –

+0

@MartinR是的,Xcode的警告還明確指出屬性獲取器不應該用於副作用。儘管如此,如果你想在顯示ViewController之前通過網點進行子視圖操作並導致調用「loadView」,那麼除了使用這兩種禁止方法之外別無選擇,除非我錯過了另一種方法,哪種情況請在此提供:http://stackoverflow.com/a/1935566/1709587 –

回答

3

awakeFromNib似乎是一個合適的地方爲您的目的。從文檔:

在實例化過程,在存檔的每個對象是 取消存檔,然後用該方法適合它類型初始化。 使用它們的 initWithCoder:方法初始化符合NSCoding協議(包括所有 子類UIViewUIViewController)的對象。
...
已經被實例化並初始化所有對象後,在筆尖加載代碼 重新建立所有這些 對象的出口和動作連接。然後它調用對象的方法awakeFromNib

+1

這裏值得注意的是,在''ViewController''是的情況下,在被引用的文檔中所做的保證是由'awakeFromNib'被調用時設置的出口變量設置的從故事板而不是'.nib'加載。見http://stackoverflow.com/questions/17400547/awakefromnib-outlets-and-storyboards-is-the-documentation-wrong和http://stackoverflow.com/questions/2723042/accessing-view-in-awakefromnib –

-1

可以覆蓋這些覆蓋在init情況:

- (id) initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if(self) 
    { 
     [self customInit]; 
    } 
    return self; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     [self customInit]; 
    } 
    return self; 
} 

- (id)init 
    { 
     self = [super init]; 
     if (self) { 
      [self customInit]; 
     } 
     return self; 
    } 

- (void) customInit 
{ 
    //custom init code 
} 

然而,這並不是很好的做法,你應該做你的子視圖操縱viewDidLoad中。

+0

謝謝。我實際上只是自己想到了這一點 - 我可能應該在詢問之前做更多的研究 - 但是:1)我不打算在初始化程序中進行任何子視圖操作;正如我所解釋的那樣,我只是想調用''self loadView'',以便子視圖被加載並且出口不爲空。 2)當'ViewController'通過'[Storyboard instantiateViewControllerWithIdentifier]'實例化'時,調用'initWithCoder'中的'[self loadView]'會拋出一個NSInternalInconsistencyException異常。 -1,因爲這不處理我要求的用例。 –

+0

@MarkAmery:這裏真的需要downvote嗎?你詢問了指定的初始化程序,並得到了答案。你不能指望foggzilla創建一個測試項目來檢查''self loadView]'是否在initWithCoder中工作。 - 其實我現在猶豫了,給出了一個替代答案,因爲如果它在你的用例中不起作用,你會低估它... –

+0

@MartinR我在問題中提供了用例。我當然不認爲foggzilla可以預測到我在嘗試使用'initWithCoder'而未經測試時遇到的問題,如果我處於他的位置,我可能會得到完全相同的答案 - 我很感激他幫幫我。儘管如此,這不是目前所說的問題的正確答案,所以我必須得到-1。 –

相關問題