2012-06-28 5 views
2

Я не совсем уверен, как объяснить свою проблему, но я попробую.Потерять указатель на делегат во время перехода через навигационный контроллер

Так что я пытался научиться использовать делегаты и протоколы и столкнулся с проблемой. У меня есть протокол: ButtonInPopOverWasPressed, с одним методом:

- (void)buttonWasPressed:(NSString *)buttonValue; 

У меня также есть главный контроллер представления и пользовательский класс поповера со свойством:

@property (retain, nonatomic) id <ButtonInPopoverWasPressed> delegate; 

В моем главном контроллере представления У меня есть кнопка и текстовую метку. Когда кнопка нажата, вы переходите к нормальному попкорпу. Я затем назначить делегата в segue.destinationViewController, чтобы быть основной контроллер представления так:

[segue.destinationViewController setDelegate:self];  

Затем, когда кнопка из пирог выбран он отображается в текстовой метки на главном экране путем вызова метода протокола, что основной view прослушивает:

[self.delegate buttonWasPressed:sender.currentTitle]; // sends the title of the button pressed to the delegate 

Это все работает нормально. Моя проблема началась, когда я хотел, чтобы переход popover к различным представлениям при нажатии кнопки вместо отправки информации обратно в основное представление. Но когда я создал контроллер навигации в качестве popover и установил связь со старым popover, все сломалось.

Когда я назначаю делегата segue (показано выше), он выходит с другой стороны как null, поэтому я полностью теряю возможность передать его другим подзонам и вернуть информацию к основному виду. Контроллер навигации всасывает делегата? Как получить делегата через NC к фактическим представлениям?

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

ответ

3

Попробуйте использовать следующий код.

NSArray *temp = [[segue destinationViewController] childViewControllers]; 
    PopoverViewController *popoverViewController = (PopoverViewController)[temp objectAtIndex:0]; 
    popoverViewController.delegate = self; 
+0

О, ничего себе! Спасибо огромное! Я работаю над этим довольно долгое время. Я надеялся, что это будет простое решение! – Firo

+0

@Joel Добро пожаловать –

0

Вместо использования навигационного контроллера, создать метод делегата на главной странице, которая открывает другой поповер и закрывает существующий поповер. Вы получите тот же результат, но без сомнительной идеи наличия контроллера навигации в popover.

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