我实现了一个自定义UIViewController
,它有多个子视图控制器(主要是使用故事板的Container View
而不仅仅是)。
我想知道“root”视图控制器向其子节点发送消息的最佳方式是什么,考虑到所发送消息所关注的子节点视图控制器不一定是“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
)观察通知,并制作根视图控制器必要时发布通知。但我发现只有向两个孩子发送信息才有点过分。
答案 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];
这是否是一种很好的方法,取决于你想要做什么。你为什么要把邮件发送到这个级别?