Как передать параметры контроллеру popover внутри контроллера навигации
У меня есть приложение для iPad с splitview и кнопкой правой панели на панели навигации элемента detailview.
Эта кнопка вызывает всплывающее окно, состоящее из контроллера навигации и двух табличных представлений. как показано на следующем рисунке
Поскольку раскадровка небольшая на картинке, я добавлю некоторые пояснения. Контроллер White - это detailViewController (правая часть контроллера splitview), который находится внутри контроллера навигации. Три вида справа от белого отображаются слева направо: navigationController, firstTableView, secondTableView.
Моя проблема в том, что мне нужно передать параметры в первое табличное представление, чтобы правильно его настроить.
Я использую это, когда контроллер представления использует один и тот же контроллер навигации.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([[segue identifier] isEqualToString:@"popoverButtonSegue"]){
MyPopoverFirstTableViewController *popoverFirstTVC = [[MyPopoverFirstTableViewController alloc] init];
popoverFirstTVC = segue.destinationViewController;
popoverFirstTVC.property1 = aProperty1;
popoverFirstTVC.property2 = aProperty2;
}
}
Моя проблема в том, что я получаю сообщение об ошибке, потому что контроллер назначения - это не мой popoverFirstTableViewController, а NavigationController и контроллер навигации, конечно же, не имеют "property1" и "property2".
Возможно, это основной вопрос, но я застрял здесь.
Как мне сделать, чтобы настроить мой просмотр таблицы, назначив некоторые из его свойств, которые я определил, когда эта таблица находится внутри контроллера навигации?
2 ответа
Вся заслуга принадлежит @Michael Kernahan, но пока он не публикует его как ответ, я напишу его как продолжение для людей, ищущих тот же ответ.
В моем случае проблема заключалась в том, что я назначаю контроллер назначения, который является контроллером навигации
popoverFirstTVC = segue.destinationViewController;
что я должен сделать, это получить доступ к topViewController этого контроллера навигации.
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([[segue identifier] isEqualToString:@"popoverButtonSegue"]){
MyPopoverFirstTableViewController *popoverFirstTVC = (MyPopoverFirstTableViewController *)((UINavigationController *) segue.destinationViewController).topViewController;
popoverFirstTVC.property1 = aProperty1;
popoverFirstTVC.property2 = aProperty2;
}
Я не совсем уверен, что буду следовать, потому что раскадровка немного мала для меня, чтобы читать. Но вы, кажется, в своем коде создали новый сверкающий popoverFirstTVC, а затем выбросили его по заданию
popoverFirstTVC = segue.destinationViewController;
Если вы прокомментируете эту строку, то в конце пишите
segue.destinationViewController.itsPopover = popoverFirstTVC;
затем вы можете выдать свой полностью сконструированный и инициализированный popoverFirstTVC и получить код во втором VC, поднять его и запустить с ним. Конечно нужно
@property (strong, readwrite) MyPopoverFirstTableViewController * itsPopover;
в шапке для вашего второго ВК.