Подготовить для участников и делегатов

У меня есть приложение с двумя 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. Это потому, что я устанавливаю текущий контроллер представления (self) в качестве делегата? Опять же, я не пытаюсь решить проблему, просто пытаясь лучше понять, что происходит.

Ответ 1

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

Ответ 2

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

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

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