Как правильно использовать модальный контроллер вида с раскадровкой xcode 4.2 - PullRequest
6 голосов
/ 24 ноября 2011

Мне было интересно, как правильно использовать раскадровку для установки контроллера представления модально. Лично я предпочитаю работать с xibs, но похоже, что раскадровка набирает популярность и будет хорошим выходом в будущем.

Способ, которым я обычно устанавливал бы контроллер представления модально, был бы следующим: допустим, у нас есть ViewControllerA (A для краткости) и ViewControllerB (B для краткости). Затем я обычно помещаю протокол в B.h, определяющий метод делегата, когда B хочет быть отклоненным, и добавляю поле id<theProtocol> delegate в качестве свойства assign. Предполагая, что я занят в А и хочу представить Б модально, я бы написал:

B* b = [[B alloc] initWithNibName:@"B" bundle:nil];
b.delegate = self;
[self presentModalViewController:B animated:YES];

Используя раскадровку, я знаю, что можно модально установить другой контроллер представления, перетаскивая Ctrl с кнопки на контроллер вида и выбирая модальный тип перехода. Мне просто интересно, хотя; где я могу установить делегат нового контроллера представления? Какова правильная практика передачи вещей вашему контроллеру модального представления? Я на самом деле не знаю, что это за сделка с Сегу ...

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011

Взгляните на этот учебник

Согласно этому, вы должны установить делегата следующим образом:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"AddPlayer"])
    {
        UINavigationController *navigationController = 
          segue.destinationViewController;
        PlayerDetailsViewController 
          *playerDetailsViewController = 
            [[navigationController viewControllers] 
              objectAtIndex:0];
        playerDetailsViewController.delegate = self;
    }
}

Где @ "AddPlayer" - это имя вашего модального перехода

0 голосов
/ 03 мая 2012

Вместо использования контроллера навигации вы можете напрямую использовать объект UIStoryboardSegue, переданный в prepareForSegue. У него есть свойство с именем destinationViewController, представляющее собой контроллер представления, для которого создается экземпляр. Я считаю, что намного чище. Это пример.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"AddPlayer"])
    {
        PlayerDetailsViewController 
          *playerDetailsViewController = 
            (PlayerDetailsViewController *) segue.destinationViewController;

        playerDetailsViewController.delegate = self;
    }
}

IMO Я думаю, что раскадровки великолепны, потому что они функционируют как проект вашего приложения. Также я никогда не любил перья. = D

...