向多个子视图控制器发送消息的最佳方法

时间:2013-03-07 19:04:37

标签: ios uiviewcontroller nsnotificationcenter childviewcontroller

我实现了一个自定义UIViewController,它有多个子视图控制器(主要是使用故事板的Container View而不仅仅是)。

我想知道“root”视图控制器向其子节点发送消息的最佳方式是什么,考虑到所发送消息所关注的子节点视图控制器不一定是“root”视图控制器的直接子节点?

例如:

View controllers hierarchy

我想从#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)观察通知,并制作根视图控制器必要时发布通知。但我发现只有向两个孩子发送信息才有点过分。

4 个答案:

答案 0 :(得分:4)

我倾向于避免NSNotificationCenter,因为如果不小心,它会创建一些Spaghetti Code。仍然,在这种情况下我会使用它,因为它更多地取消了消息应该如何在childsViewControllers和ochildsViewControllers的孩子之间传播的逻辑。

答案 1 :(得分:0)

我认为通过NSNotificationCenter是最好的方法。每个子视图控制器可以自己决定他们想要响应的通知;它负责过滤发布通知的对象。

答案 2 :(得分: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];
    }
}

答案 3 :(得分:0)

您可以使用self.childViewControllers访问所有子项,并传递特定索引以获取特定子项。要达到4,你必须访问3的topViewController。

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

这是否是一种很好的方法,取决于你想要做什么。你为什么要把邮件发送到这个级别?