Потерять указатель на делегата при переходе через навигационный контроллер

Я не совсем уверен, как объяснить мою проблему, но я попытаюсь.

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

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

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

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

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

   [segue.destinationViewController setDelegate:self];    

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

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

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

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

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


person Firo    schedule 28.06.2012    source источник


Ответы (2)


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

    NSArray *temp = [[segue destinationViewController] childViewControllers];
    PopoverViewController *popoverViewController = (PopoverViewController)[temp objectAtIndex:0];
    popoverViewController.delegate = self;
person lu yuan    schedule 28.06.2012
comment
Ух ты! Большое спасибо! Я работаю над этим уже довольно давно. Я надеялся, что это будет простое решение! - person Firo; 28.06.2012

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

person Dustin    schedule 28.06.2012