2010-08-17 4 views
1

Мое приложение использует контроллер панели вкладок с двумя элементами панели вкладок: каждый элемент является навигационным контроллером.просмотр контроллеров связи в нескольких навигационных контроллерах

Я пытаюсь получить доступ к одному контроллеру представления в одном контроллере навигации с другого контроллера в другом контроллере навигации, возможно ли это? и как??

Буду признателен за любую возможную помощь, спасибо.

Мохсен

ответ

3

Вы могли бы рассмотреть возможность использования уведомлений или (еще проще) Key-Value наблюдающей.

Сегодня утром я дал кому-то совет о связи между контроллерами в контексте UINavigationController. Затем сегодня днем ​​я попробовал KVO в первый раз, и мне пришлось вернуться и дать разные советы. KVO WAY проще, чем пытаться преследовать вещи в иерархии представлений. Вы просто объявляете, что наблюдает за чем, а затем устанавливают эту вещь, чтобы улавливать уведомления об изменениях. Кусок пирога!

EDIT:

Уведомление, вероятно, путь здесь, на самом деле - если бы вы оба объекта инстанцированного в одном месте вы можете зарегистрировать один в качестве наблюдателя на ключах других, но это не обязательно в случае, если вы создаете панель вкладок из шаблонов.

Итак, уведомления. Идея заключается в том, что вы регистрируете один контроллер представлений в качестве наблюдателя уведомлений, затем записываете уведомления с другого контроллера представления, а наблюдатель уведомляется при отправке уведомления. Это немного похоже на ваше приложение, отправляющее электронную почту самому себе.

Регистрация для получения и сообщения выглядит следующим образом:

ViewControllerOne.m:

-(void)viewDidLoad //a likely place, but not the only place you might do this 
{ 
    .... 
    // whatever else you're doing to initialize your VC, and then 

    [[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector(iWasNotified:) 
      name:@"myNotification" 
      object:nil]; 
} 

-(void)iWasNotified:(NSNotification *)notification 
{ 
    NSString *passedValue = (NSString *)notification.object; 
    NSLog(@"We got notified and received: %@", passedValue); 
} 

А затем отправить сообщение так же просто, как это:

ViewControllerTwo.m:

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"myNotification" 
       object:@"I'm passing you this NSString object!"]; 

Вы, очевидно, не ограничиваетесь передачей строки i n поле object:. Несколько более вероятным будет использование self, а затем у вас будет доступ к любым открытым полям контроллера представления сообщений.

Это их голые кости. Там намного больше тонкостей вы можете получить в, и все это выложил здесь: http://developer.apple.com/iphone/library/documentation/cocoa/Conceptual/Notifications/Introduction/introNotifications.html

+0

Спасибо большое за ответ, но ... Я сожалею, я очень новые разработки iPhone SDK. Если вы можете продумать больше, какие уведомления и как их использовать. Можно ли предоставить пример кода. Я бы очень признателен. Спасибо – mshaaban

+0

Большое спасибо за ваше объяснение. Это помогло мне понять концепцию уведомлений намного лучше. Хотя в моем приложении мне нужно было поделиться данными переменных экземпляра и методами экземпляра между контроллерами представлений, которые находятся в разных стеках контроллеров навигации, поэтому я закончил использование одноэлементного класса для взаимодействия между двумя диспетчерами. – mshaaban

+0

В этом случае KVO может быть лучшим способом.Вы можете зарегистрировать определенный контроллер представления в качестве наблюдателя в определенных полях вашего синтаксиса данных и вызывать определенный метод, когда это поле будет изменено. Посмотрите документы Apple на это, это довольно просто. –

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