2

ストーリーボードを使用してビュー コントローラーの作成を制御するにはどうすればよいですか? ここでカプセル化の利点とシングルトンの問題について読んだ後、Ive は自分のコードをリファクタリングしました。ファクトリを使用して vc をインスタンス化し、依存関係を提供します。しかし、今はストーリーボードを使いたいと思っています。ストーリーボードでファクトリ メソッドを呼び出す方法はありますか? 現在、子View Controllerをインスタンス化する必要がある場合、次のようなコードがあります。

UIViewController *vc = [self.factory buildChildViewController];

ファクトリ メソッドでは、すべての依存関係が処理されます。

- (UIViewController*) buildChildViewController {
    ChildViewController *cvc = [[ChildViewController alloc] initWithNibName:nil bundle:nil];
    [cvc setDatabase:self.database];
    [cvc setQuery:[self buildSomeQuery:cvc]];
    return cvc;
}
4

2 に答える 2

2

このためには、サブクラス化UIStoryBoardしてオーバーライドする必要があります-instantiateViewControllerWithIdentifier:。ただし、クラスをストーリーボード ファイルに割り当てる方法はないようです。

ただし- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender、ビューコントローラーを介してコントローラーに依存関係を提供できます。

ストーリーボードは再利用を意図したものではないと思います。再利用可能なコンポーネントを簡単に接続できるようにするだけです。OOPに関しては、これは良い解決策ではありません。

于 2013-01-24T11:08:51.117 に答える
1

この記事で示したアプローチを使用して、ストーリーボードでファクトリ パターンを実行しました。

https://medium.com/ios-os-x-development/safer-uiviewcontroller-creation-when-using-storyboards-1915ac2b2c80#.ebor5maq7

このアプローチで私が本当に気に入っているのは、ストーリーボードを使用して依存性注入を実行できるため、クラス間で dataApi を簡単に渡すことができることです。

また、使用する必要がなくなりましたprepareWithSegue。代わりに、次のようにビューを初期化します。

func didSelectApplication(application: Application) {

    let factory = StoryboardViewControllerFactory(storyboard: UIStoryboard(name: "Main", bundle: nil))
    let applicationController = factory.createApplicationViewController(application, dataApi: dataApi)
    navigationController?.pushViewController(applicationController, animated: true)
}

アプリケーションを引数として渡すことprepareForSegueができなかったので、クラスにプロパティがありました。これで、クラスのプロパティが不要になったメソッドに渡すことができます。私が個人的に好むもの。

于 2016-08-08T14:21:40.597 に答える