0

我实现了一个定制的UIViewController,它具有多个子视图控制器(主要是使用故事板的Container View,但不仅仅是)。将消息发送给多个子视图控制器的最佳方式

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

例如:

View controllers hierarchy

我想从#0发送消息,以查看控制器#1#4。天真的实现是迭代的#0孩子送进来的消息,像这样:

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

但它根本不起作用,因为#3将收到消息(或者可能不是,如果它是一个UINavigationController我正在调用一个自定义方法),并且不会将它传播给它的子项(这里是#4)。

因此是否有可能向其子女发送消息,并让消息通过UIViewController层次结构传播?

如果没有,一个替代方案是使用NSNotificationCenter,使感兴趣的消息(#1#4)观察用于通知在孩子,并使根视图控制器交的通知,如果必要。但是我发现仅仅向两个孩子发送消息就有点矫枉过正。

+0

首先,如果方法接受一个参数,并且你没有一个参数,那就是UB。 – 2013-03-07 19:08:45

+0

我不认为这是矫枉过正 - 使用NSNotificationCenter。 – 2013-03-07 19:09:16

+0

经典NSNotificationCenter – rocky 2013-03-07 19:10:12

回答

4

我倾向于避免NSNotificationCenter,因为如果你不小心,它会创建一个Spaghetti Code位。尽管如此,在这种情况下,我会使用它,因为它是更多的矫枉过正采取的消息应该如何在childsViewControllers之间传播的逻辑和ochildsViewControllers的孩子的可能性。

+0

它是通知中心。谢谢 ! – 2013-03-07 19:46:26

0

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

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]; 
    } 
} 
0

您可以访问所有的孩子与self.childViewControllers,并传递一个特定的索引,以获得一个特定的孩子。要达到4,您必须访问3的topViewController。

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

这是否是一个很好的方法来做到这一点,取决于你想要做什么。你为什么要发送消息到这个级别?

相关问题