2012-03-18 69 views
50

即時通訊有麻煩重寫初始化方法爲我的故事板中設計的我的CustomViewController。視圖控制器自定義初始化方法與故事板

現在即時通訊做(在我mainViewController):

self.customViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"CustomVC"]; 
self.customViewController.myObject = someObject; 

和我在viewDidLoad中(CustomViewController)

[self.label setText:self.myObject.someString]; 

該工程確定。

但是,這是正確的方法嗎?我應該添加一個自定義的init方法(或覆蓋)到我的CustomViewController?像initWithObject一樣:?我不知道如何調用我的自定義初始化方法,而不是UIStoryboard instantiateViewControllerWithIdentifier:,並且我沒有接到調用initinitWithNibName。我可以使用:- (id)initWithCoder:(NSCoder *)decoder

請給我一些建議!

謝謝!

+0

你正在做的一切都正確。你可以在你的自定義類中覆蓋initWithCoder,也就是你的_customViewController對象的類文件來做自定義init – 2013-07-05 04:19:40

回答

58

故事板中視圖控制器的指定初始值爲-initWithCoder:。由於故事板中的大多數視圖控制器都是通過segse創建的,因此您通常會在-prepareForSegue:sender:期間看到設置的狀態。

如果您直接從故事板實例化視圖控制器,就像您提供的示例那樣,那麼您選擇的模式是合適的。

+0

很高興知道我在做的事情應該如此! – 2012-03-25 16:30:31

+2

這是一個非常糟糕的設計,因爲它讓你在swift(with!?)中使用Optionals,或者如果開發人員忘記設置正確的變量,則可以訪問可能的nils。很遺憾,這是「適當」的解決方案:在這個問題上,一個很好的來源,可選擇快速/客觀的:http://www.objc.io/issue-16/power-of-swift.html – 2014-10-16 16:31:02

+0

只是爲了迴應到@GuilhermeSilveira的評論,這個問題是從2012年開始,Swift甚至不爲公衆所知,即使是這樣,設計模式在Objective-C和Swift之間也有很大的不同,所以如果你正在開發中,不應該堅持這種模式迅速。 – 2015-11-23 20:35:23

0

作爲此問題的另一個「解決方法」,您可以使用委派。創建一個協議,作爲故事板中的UIViewController子類的數據源。順應此數據源協議,實現它和加載你的UIViewController子類後立即使用它:

required init?(coder aDecoder: NSCoder) 
    { 
     super.init(coder: aDecoder) 

     //invoke your data source here 
    } 

我知道......我也不喜歡這一點,但...;)

相關問題