2012-01-12 3 views
10

У меня есть универсальное приложение, в котором я использую один и тот же контроллер для раскадровки IPad и IPhone. я поставил UILongPressGestureRecognizer на UITableView, что когда клетка давила на iPhone он вызывает действие, выполнить SEGUE:prepareForSegue не вызывается после performSegue: withIdentifier: с popover style

-(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, это единственный способ, которым я нашел для передачи выбранной ячейки. Может быть, есть лучшее решение. Все работает отлично, в некотором смысле, что выполняется segue, и до того, как будет вызвана команда prepareForSegue.

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

Что я делаю неправильно?

+0

У меня такая же проблема. viewdidload вызывается, но не выполняет segue – 1dayitwillmake

ответ

20

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

  • 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 
    [email protected]"prop1"; 
    [email protected]"prop2"; 

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

} 

не знаю, если это ожидаемое поведение с, так или иначе пирог теперь все работает.

+0

Ваше исправление сработало для меня тоже так, спасибо, но это странная проблема, поскольку она только что появилась для меня, даже если у меня есть несколько других поп-программ, которые отлично работают и полагаются на prepareForSegue для пересылки объектов. – GeoffCoope

+0

То же самое здесь, иногда prepareForSegue вызывается перед viewDidLoad, иногда после ... Спасибо за исправление. –

+0

Я думаю, что prepareForSegue вызывается после viewDidLoad, когда segue вызывается из Storyboard, и это иначе, если вы запускаете его вручную, используя -performSegueWithIdentifier :. – gklka

1

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

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

Я не следовать этому образцу другого дня, когда я пытался повторно использовать детали VC в моем фильме приложении, и это дало мне неприятность ,

У меня нет большого опыта с popovers; однако, если вышеприведенный шаблон используется с детальным VC, который отображается внутри popover, то не будет ли конфигурация детализации VC настроена при настройке свойств детали VC из метода prepareForSegue?

Смежные вопросы