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).

So есть ли возможность отправить сообщение своим детям и передать сообщение через иерархию UIViewController?

Если нет, то альтернатива будет использовать NSNotificationCenter, сделать ребенок, заинтересованных в сообщении (#1 и #4) наблюдать за уведомления, и сделать зрение корневой контроллер опубликовать уведомление, когда это необходимо. Но я нахожу это немного переполненным только для отправки сообщения двум детям.

+0

На первом месте, если метод принимает аргумент и вы вызываете его без него, это UB. – 2013-03-07 19:08:45

+0

Я не думаю, что это слишком много - используйте NSNotificationCenter. –

+0

Classic NSNotificationCenter – rocky

ответ

4

Я стараюсь избегать NSNotificationCenter, потому что если вы не будете осторожны, это создаст немного Spaghetti Code. Тем не менее, в этом случае я бы использовал его, потому что это еще больше перехватило логику того, как сообщение должно распространяться между childsViewControllers и возможностью дочерних элементов ochildsViewControllers.

+0

Центр уведомлений. Благодаря ! –

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, вам нужно получить доступ к topViewController 3.

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

Если это хороший способ сделать это, это зависит от того, что вы пытаетесь сделать. Почему вы отправляете сообщения на этот уровень?

 Смежные вопросы

  • Нет связанных вопросов^_^