2012-03-18 11 views
50

私のストーリーボードで設計した私のCustomViewControllerの初期化メソッドをオーバーライドするのに問題があります。viewControllerストーリーボードでカスタムinitメソッド

は今(私のmainViewControllerで)やってイム:

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

と私は、これはうまく動作のviewDidLoad(CustomViewController)

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

を持っています。

しかし、それは正しい方法ですか? CustomViewControllerにカスタムのinitメソッド(またはオーバーライド)を追加する必要がありますか? initWithObjectのように:?私はUIStoryboard instantiateViewControllerWithIdentifier:の代わりに私のカスタムinitメソッドを呼び出す方法を知らないし、initinitWithNibNameも呼び出していない。

多分私は使用する必要があります:- (id)initWithCoder:(NSCoder *)decoder

お願いします。

ありがとうございました!

+0

あなたがやっていますすべての権利。カスタムクラスのinitWithCoderをオーバーライドすることができます。つまり、カスタムのinitを実行するための_customViewControllerオブジェクトのクラスファイルです。 –

答えて

58

ストーリーボードのビューコントローラ用に指定された初期化子は-initWithCoder:です。ストーリーボードのほとんどのビューコントローラはセグを使用して作成されるため、通常、-prepareForSegue:sender:の間に設定された状態が表示されます。

提供した例のようにストーリーボードから直接ビューコントローラをインスタンス化する場合は、選択したパターンが適切です。

+0

imは、想定されているようなことを行うことを知っています。 –

+2

それは、あなたが正しい変数を設定することを忘れた場合に、素早くOptionalsを使用して(!?)、または可能なnilsにアクセスできるようになるので、かなり悪いデザインです。これが "適切な"解決策であることは悲しいことです。この問題に関する優れた情報源は、迅速な/客観的なcオプションです。http://www.objc.io/issue-16/power-of-swift.html –

+0

@GuilhermeSilveiraのコメントによれば、この質問は2012年からのものであり、素早く誰にも知られていなくても、Objective-CとSwiftのデザインパターンが異なっているので、迅速。 –

0

この問題の別の「回避策」として、委任を使用することができます。ストーリーボードからUIViewControllerサブクラスのデータソースとして機能するプロトコルを作成します。それを実装し、右のあなたのUIViewControllerのサブクラスをロードした後、それを使用し、このデータソースプロトコルに準拠:

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

     //invoke your data source here 
    } 

私が知っている...私はまた、これが好きではなく...しません。)

関連する問題