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

這是否是一個很好的方法來做到這一點,取決於你想要做什麼。你爲什麼要發送消息到這個級別?

相關問題