web-dev-qa-db-ja.com

ストーリーボードを使用したuiviewControllerカスタムinitメソッド

ストーリーボードで設計されたCustomViewControllerの初期化メソッドのオーバーライドに問題があります。

今私がやっている(私の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

アドバイスをください!

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

50
Nicolas S

ストーリーボードのView Controllerに指定された初期化子は-initWithCoder:。ストーリーボードのほとんどのView Controllerはセグエ経由で作成されるため、通常、-prepareForSegue:sender:

指定した例のように、ストーリーボードから直接View Controllerをインスタンス化する場合は、選択したパターンが適切です。

58
retainCount

この問題の別の「回避策」として、委任を使用できます。ストーリーボードからUIViewControllerサブクラスのデータソースとして機能するプロトコルを作成します。このデータソースプロトコルに準拠して実装し、UIViewControllerサブクラスを読み込んだ直後に使用します。

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

        //invoke your data source here
    }

私も知っています...私もこれが好きではありませんが...;)

0
Despotovic