2013-05-17 69 views
0

我有一個想從故事板中添加的UIViewController的子類。從故事板中添加的自定義初始化子視圖

所以我使用的是什麼,似乎標準方法:

SubViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SubViewControllerID"]; 
[self addChildViewController:svc]; 
[self.view addSubview:svc.view]; 

這是不錯,但如果我想呼籲子視圖自定義的初始化方法是什麼?

我可以這樣做:

svc = [svc initWithFoo:@"Hello"]; 

這似乎已經在addSubview調用序爲它工作後去了。

這是最好的方法嗎?

似乎有點非正統。在已經創建的對象上調用init方法似乎不再是真正的init方法。

也許我應該把它叫做setWithFoo:或者什麼東西,而不是讓它返回任何東西?

回答

0

SubViewController *svc = [self.storyboard instantiateViewControllerWithIdentifier:@"SubViewControllerID"];

將導致inited的SubViewController與它的- (id)initWithCoder:(NSCoder *)decoder {}方法。

重寫方法(不要忘記調用super

+0

我可以重寫initWithCoder,但不允許我設置屬性作爲它的初始化,還是有其他我需要做的呢? – josef

0

如果您想在視圖控制器實例化後爲視圖控制器做額外的設置,您可以在視圖控制器的類中創建一些方法,並在故事板的instantiate方法之後調用它們。

但是要小心,如果您嘗試對這些方法中的任何UI組件進行更改,那麼它們將不會被應用,並且應用程序可能會崩潰。因此,使用這些方法將參數設置爲視圖控制器(如陣列對象或任何類型的數據),然後將視圖控制器的視圖中的UI更改應用於視圖控制器的viewDidLoad/viewWillAppear/viewDidAppear方法中。

0

基本上我認爲答案是,你不能從故事板添加ViewControllers使用自定義initialisers。相反,您必須直接或通過方法在上述生命週期的適當時間設置屬性。如上所述,VC將通過initWithCoder實例化,因此調用額外的初始化器可能是多餘的(?)。

我遇到了問題,試圖使用自定義初始化程序,其中包含超級調用,如果我在添加子視圖之前調用它。我只是添加了一個空白的視圖,我想是因爲超類似乎並不知道當時的故事板。我取得了更多的成功,取消了對超級電話的呼叫,但這看起來不對

這種情況下,將更多的子視圖添加到滾動視圖。爲了簡單起見,我將其從我的例子中排除了。

相關問題