prepareForSegue не вызывается после executeSegue: withIdentifier: со стилем popover - PullRequest
10 голосов
/ 12 января 2012

У меня есть универсальное приложение, в котором я использую один и тот же контроллер для раскадровки IPad и IPhone. Я поместил UILongPressGestureRecognizer в UITableView, который при нажатии на iPhone на ячейке вызывает действие, которое выполняет переход:

-(IBAction)showDetail:(id)sender {
    UILongPressGestureRecognizer *gesture = (UILongPressGestureRecognizer*)sender;
    if (gesture.state == UIGestureRecognizerStateBegan) {
        CGPoint p = [gesture locationInView:self.theTableView];

        NSIndexPath *indexPath = [self.theTableView indexPathForRowAtPoint:p];
        if (indexPath != nil) {
            [self performSegueWithIdentifier:SEGUE_DETAIL sender:indexPath];
        }
    }
}

последовательность - подробный вид, выполняемый как «толчок». Первое, что вы должны заметить, это то, что отправителем является NSIndexPath, единственный способ, который я нашел для прохождения выбранной ячейки. Может быть, есть лучшее решение. Все работает нормально, в том смысле, что передача выполняется, и перед вызовом prepareForSegue тоже.

Однако на iPad я изменил идентификатор перехода на Popover. Теперь все работает частично, переход выполняется, но prepareForSegue не вызывается, и, следовательно, контроллер представления назначения не настроен должным образом.

Что я делаю не так?

Ответы [ 2 ]

20 голосов
/ 13 января 2012

Что я обнаружил до сих пор, так это то, что с любым идентификатором segue, который не является поповерным, это вызовы, сделанные iOS:

  • prepareForSegue (на контроллере источника)
  • viewDidLoad(на контроллере назначения)

во время перехода в режиме поповера порядок вызовов:

  • viewDidLoad (на контроллере назначения)
  • prepareForSegue (на контроллере источника)

только потому, что я поместил всю свою логику в viewDidLoad, контроллер не был правильно инициализирован, и произошел сбой.Так что это не совсем верно, что prepareForSegue не вызывается, правда в том, что я получаю исключение, и я ошибочно ошибся, так как prepareForSegue не вызывается.

Я не могу поместить все в viewWillAppear, потому что вызовCoreData должен был быть сделан, и я не хотел проверять, были ли объекты в порядке каждый раз, когда отображение представления.

Как я решил это?Я создал другой метод в контроллере назначения

-(void)prepareViewController {
  // initialization logic...
}

и изменил метод prepareForSegue в самом контроллере источника:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  MyViewController *mvc = (MyViewController*)[segue destinationViewController];
  // passing variable 
  // with segue style other than popover this called first than viewDidLoad
  mvc.myProp1=@"prop1"; 
  mvc.myProp2=@"prop2";

  // viewWillAppear is not yet called
  // so by sending message to controller
  // the view is initialized
  [mvc prepareViewController];

}

не знаю, является ли это ожидаемым поведением с popover, в любом случае, сейчасработают.

1 голос
/ 01 марта 2012

Я заметил, что код дополнительной платы для шаблона Master-Detail Xcode (iPhone) использует следующий шаблон для настройки представления подробного VC:

  1. подробные сеттеры VC (для свойств) перезаписываются, чтобы вызвать метод configureView (configureView обновит все ваши элементы управления в представлении, например метки и т. Д.)
  2. подробный метод viewDidLoad VC также вызывает метод configureView

Я не следовал этому шаблону на днях, когда пытался повторно использовать подробный ВК в своем приложении для фильмов, и это доставило мне неприятности.

У меня нет большого опыта работы с поповерами; однако, если приведенный выше шаблон используется с подробным ВК, который отображается внутри всплывающего окна, то не будет ли настраиваться представление подробного ВК, когда вы задаете свойства подробного ВК из метода prepareForSegue?

...