Как получить контроллер представления, обернутый UIPopoverController из UIStoryboardPopoverSegue?

У меня есть UISplitViewController с мастером, имеющим UIViewController, встроенный в UINavigationController. Кнопка на панели инструментов отвечает за запуск UIPopoverController через переход. Такой всплывающий контроллер является оболочкой для UIViewController, также встроенного в UINavigationController, который называется SettingsViewController.

Я могу получить указатель на UIPopoverController из UIStoryboardPopoverSegue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell *)sender
{
  if ([segue.identifier isEqualToString:@"Settings"]) {
    UIStoryboardPopoverSegue *popoverSegue = (UIStoryboardPopoverSegue*) segue;

    SettingsViewController *settingsViewController = ... // TODO
    settingsViewController.popoverController = popoverSegue.popoverController;
  }
}

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

Что мне не хватает, чтобы понять это правильно?

Спасибо за вашу помощь!


person Tiago Fernandez    schedule 22.08.2012    source источник


Ответы (2)


UIPopoverSegue содержит UIPopoverController

UIPopoverController *popoverController = popoverSegue.popoverController;

С этим вы можете легко получить contentViewController (представление отображается во всплывающем окне)

UINavigationController *contentNC = (UINavigationController *) popoverController.contentViewController;

А из контроллера навигации по содержимому вы получаете фактический контроллер представления:

SettingsViewController *settingsVC = [contentNC.viewControllers lastObject];

Это решает вашу проблему?

person lukaswelte    schedule 22.08.2012
comment
Похоже, это приведет его к контроллеру содержимого всплывающего окна, который, похоже, в данном случае будет UINavigationController. Ему все еще нужно раскрутить еще один прыжок и захватить корневой контроллер представления контроллера UINavigation. - person Jon Hess; 22.08.2012
comment
Точно, я только что добавил это к ответу Лукаса. Теперь все работает отлично, спасибо! - person Tiago Fernandez; 22.08.2012

У меня очень похожая настройка в моем приложении, как описано в начале вопроса.

В моем prepareForSegue (и внутри, где я проверяю segue.identifier) я беру и устанавливаю вещи в контроллере представления всплывающего окна следующим образом:

settingsViewController *settingsPop = segue.destinationViewController;
settingsPop.someVar = self.var;

segue.destinationViewController делает это просто и легко.

person Nick    schedule 16.09.2013