0

UIViewController複数の子ビューコントローラーを持つカスタムを実装しました(主にストーリーボードを使用しContainer Viewますが、それだけではありません)。

送信されたメッセージに関係する子のViewControllerが必ずしも直接の子であるとは限らないことを考慮して、「root」ビューコントローラがその子にメッセージを送信するための最良の方法は何でしょうか。 「ルート」ビューコントローラ?

例えば:

コントローラ階層を表示する

#0ビューコントローラ#1とにメッセージを送信したい#4。ナイーブな実装は#0、次のように、の子を反復処理してメッセージを送信することです。

for (UIViewController *childVC in self.childViewControllers)
{
    if ([childVC respondsToSelector:@selector(myMessage:)])
    {
        [childVC performSelector@selector(myMessage:)];
    }
}

ただし、メッセージを受信し(または、カスタムメソッドを呼び出している#3場合はおそらく受信せず)、その子に伝播しないため、単純に機能しません(ここ)。UINavigationController#4

それで、自分の子供にメッセージを送信し、そのメッセージを階層全体に伝播させる可能性はありますか?UIViewController

そうでない場合は、を使用してNSNotificationCenter、メッセージに関心のある子(#1および#4)に通知を監視させ、必要に応じてルートビューコントローラーに通知を投稿させることもできます。しかし、2人の子供にメッセージを送るだけでは少しやり過ぎだと思います。

4

4 に答える 4

4

NSNotificationCenter注意しないと少しスパゲッティ コードが作成されるので、私は避ける傾向があります。それでも、この場合はそれを使用します。なぜなら、childsViewControllers と可能性のある ochildsViewControllers の子の間でメッセージがどのように伝播するかというロジックを採用するのはさらにやり過ぎだからです。

于 2013-03-07T19:09:01.790 に答える
0

self.childViewControllersを使用してすべての子にアクセスし、特定のインデックスを渡して特定の子にアクセスできます。4に到達するには、3のtopViewControllerにアクセスする必要があります。

UIViewController *child4 = [(UINavigationController *)self.childViewControllers[2] topViewController];

これがこれを行うための良い方法であるかどうかは、何をしようとしているかによって異なります。なぜこのレベルまでメッセージを送信するのですか?

于 2013-03-07T19:32:16.630 に答える
0

このようなこともできますが、私はそれが良い考えだと言っているわけではありません:

@interface UIViewController (ReverseResponder)

- (void)reverseRespond:(SEL)selector withObject:(id)object;

@end

@implementation UIViewController (ReverseResponder)

- (void)reverseRespond:(SEL)selector withObject:(id)object
{
    if ([self respondsToSelector:selector]) {
        [self performSelector:selector withObject:object];
    }

    for (UIViewController* childViewController in self.childViewControllers) {
        [childViewController reverseRespond:selector withObject:object];
    }
}
于 2013-03-07T19:14:27.427 に答える
0

通うNSNotificationCenterのが一番だと思います。各子View Controllerは、応答する通知を自分で決定できます。通知を投稿するオブジェクトからフィルタリングする責任があります。

于 2013-03-07T19:10:49.157 に答える