10

My view controllers need to send messages to a couple of model objects. How do I obtain references to these model objects inside the view controller?

These model objects are "singletons" (in that there should only be one copy of them in the system at once) and they are used by multiple view controllers. So I can't instantiate them in the init method of each view controller.

I can't use constructor injection as the runtime chooses the init method that gets used to create the view controller.

I can't use "setter injection" as at no point (that I am aware of) do I have both a reference to the newly constructed view controller and references to the "singleton" model objects.

I don't want to turn the model objects into proper singletons and call a static method on them from the view controllers to retrieve the singleton instance, as this is a problem for testability. (Having the model objects as properties on the AppDelegate is essentially the same as doing this.)

I am using iOS 6 with Storyboards.

4

4 に答える 4

8

私はちょうど同じ問題に対処しました。ストーリーボードを使用しているため、 をインスタンス化しないUIViewControllersため、「コンストラクター インジェクション」を使用できません。セッター注入を使用して自分自身を辞任する必要があります。

私のアプリのルートはUITabViewController. UINavigationController2 つの s があり、最初の aAControllerViewと 2 番目の があるとしましょうBControllerView。次AppDelegate.applicationDidFinishLaunchingWithOptionsの方法でルートコントローラーを取得できます。

UITabBarController *tabBarController = (UITabBarController *) self.window.rootViewController;

次に、コントローラーを反復処理できます。

NSArray* viewControllers = [tabBarController viewControllers];
for (UIViewController *viewController in viewControllers) {
    UINavigationController *navigationController = (UINavigationController*) viewController;
    UIViewController *viewController = navigationController.topViewController;
    if ([viewController isKindOfClass: [AControllerView class]]) {
        AControllerView *a = (AControllerView*) viewController;
        // Inject your stuff
    }
    if ([viewController isKindOfClass: [BControllerView class]]) {
        BControllerView *b = (BControllerView*) viewController;
        // Inject your stuff
    }
}

それが役に立てば幸い。

于 2013-01-07T17:38:19.830 に答える
4

使ってみませんNSNotificationCenterか?

NSNotificationCenterオブジェクト(または単に通知センター)は、プログラム内で情報をブロードキャストするためのメカニズムを提供します。NSNotificationCenterオブジェクトは、基本的に通知ディスパッチテーブルです。

シングルトンまたは一般的なものの両方で通知オブザーバーを追加できます。メッセージを送信する必要がある場合は、適切な通知を投稿するだけです。その後、オブザーバーがアクションを管理します。

NSNotificationCenterの詳細

于 2012-11-01T01:08:36.850 に答える
2

これは、View Controller オブジェクトへの参照を取得することではないでしょうか。ストーリーボードを使用している場合、使用されているウィンドウrootViewControllerまたはセグエが適切なビュー コントローラー オブジェクトを提供します。

つまり、アプリ起動時のView Controllerのインスタンスは

self.window.rootViewController

シーン間の遷移にセグエを使用する場合 (View Controller):

[segue destinationViewController]また[segue sourceViewController]

xibs を使用している場合は、インターフェイス ビルダーから外部オブジェクト (プロキシ オブジェクト) を使用してモデル オブジェクトを提供することもできます。唯一のことは、ペン先のインスタンス化を自分の手に渡さなければならないということです。

于 2013-03-28T12:17:49.433 に答える