подготовить для обсуждения и делегатов - PullRequest
10 голосов
/ 20 декабря 2011

У меня есть приложение с двумя segues.В одном из сегментов текущий контроллер представления становится делегатом, а другой - нет.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"MoreOptions"]) {
        UINavigationController *navigationController = segue.destinationViewController;
        MoreOptionsViewController *controller = (MoreOptionsViewController *)navigationController.topViewController;
        controller.delegate = self;
    } else if ([segue.identifier isEqualToString:@"FullStoryView"]) {
        SingleStoryViewController *detailViewController = segue.destinationViewController;
        detailViewController.urlObject = sender;
    }
}

Все это работает нормально, но я хотел бы попытаться понять код лучше.Чего я не понимаю, так это того, что мне нужно получить ссылку на MoreOptionsViewController, взяв его из navigationController.topViewController, а не просто получить его из segue.destinationViewController, как я делаю во втором условии if.Это потому, что я устанавливаю текущий контроллер представления (сам) в качестве делегата?Опять же, я не пытаюсь решить проблему, просто пытаюсь лучше понять, что происходит.

Ответы [ 2 ]

11 голосов
/ 20 декабря 2011

Взгляните на свою раскадровку, и должно быть понятно, почему это так. Вы ввели MoreOptionsViewController в UINavigationController и подключили переход к навигационному контроллеру, сделав его destinationViewController. Это довольно распространено.

4 голосов
/ 20 декабря 2011

Представитель в значительной степени не имеет значения в контексте вашего вопроса.

Ваш первый целевой объект segue - это навигационный контроллер, который содержит контроллер представления, который вам действительно интересен.не имеет каких-либо свойств, которые вы заинтересованы в настройке.

Ваш второй переход идет непосредственно к одному контроллеру представления, поэтому вы можете получить к нему прямой доступ.

...