Установка делегата для второго уровня tableViewController, представленного во всплывающем окне - PullRequest
0 голосов
/ 19 марта 2012

Мое приложение запускается в контроллер навигации. Контроллер корневого представления имеет кнопку, которая создает всплывающее окно с tableViewController, позволяющее пользователю выбрать ячейку, которая, используя делегат TableViewController, который устанавливается при создании всплывающего окна, хотя preperaForSegue, передает обратно в корневой контроллер представления и помещает соответствующий ViewController в стек навигации.

Делегат настроен так:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"planningSegue"]) 
    {
        [segue.destinationViewController setDelegate:self];
    }
}

Метод называется так:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[self delegate] gotoPlanningToPage:[tableView cellForRowAtIndexPath:indexPath].textLabel.text];
}

Это отлично работает.

У меня есть другая кнопка на контроллере корневого представления, которая вызывает другой поповер с другим tableViewController, у этого есть список опций, каждый из которых при выборе будет передавать другое представление таблицы в стек (все еще внутри поповера) ) содержащий список предметов. При выборе одного из них необходимо связаться с основным ViewController (тот, который изначально создал поповер), чтобы добавить новый вид в свой стек навигации, аналогично тому, как это делает первая кнопка.

Вопрос : Как / где мне установить делегата для второго tableViewController?

Я не могу создать его при создании всплывающего окна, поскольку второй tableViewController появляется только тогда, когда в первом TVC выбрана ячейка. Но я не могу понять, как настроить его с первого TVC, когда вызывается второй TVC, потому что я не вижу способа связаться с создателем (родителем?) Всплывающего окна.

Единственная мысль, которая у меня возникла, - установить основной ViewController в качестве делегата для TVC первого уровня в поповер, затем установить этот TVC в качестве делегата для TVC второго уровня и передать сообщение обратно через него, с другой ... Это просто не правильно, хотя я не могу не сказать, что должен быть более простой / понятный способ сделать это, чем создание делегата с единственной целью помочь кому-то другому установить его делегат. !

Я все еще относительно новичок во всем этом, поэтому извиняюсь, если не понял смысла или пропустил что-то явно очевидное!

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

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

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UITableViewCell *)sender
{
    SecondLevelTVC *secondLevelTVC = (SecondLevelTVC *)segue.destinationViewController;
    UINavigationController *mainNav = (UINavigationController *)self.view.window.rootViewController;
    RootAppViewController *rootAppViewController = (RootAppViewController *)mainNav.topViewController;
    secondLevelTVC.delegate = rootAppViewController;
}
0 голосов
/ 19 марта 2012

Ваша идея в основном верна.Вы можете установить основной ViewController в качестве делегата для TVC первого уровня, как вы говорите.Затем, поскольку ваш TVC первого уровня уже имеет ссылку на основной viewController, вы можете использовать его для установки свойства делегата TVC второго уровня во время его создания (когда выбрана строка таблицы).

Итак, вваш первый уровень TVC:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    SecondTVC *secondTVC = [[SecondTVC alloc] init];
    secondTVC.delegate = self.delegate;
    [self.navigationController pushViewController:secondTVC animated:YES];
}
...