2012-01-12 9 views
10

Mam uniwersalną aplikację, w której współużytkuję ten sam kontroler dla storyboardów IPad i IPhone. mam umieścić UILongPressGestureRecognizer na UITableView, że gdy komórka jest wciśnięty na iPhone wywołuje czynność, którą przeprowadzić segue:Funkcja prepareForSegue nie jest wywoływana po performSegue: withIdentifier: ze stylem popover

-(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]; 
     } 
    } 
} 

segue szczegółowy widok występował jako „push”. Pierwszą rzeczą, którą powinieneś zauważyć, jest to, że nadawca jest NSIndexPath, to jedyny sposób, jaki znalazłem dla przekazania wybranej komórki. Może jest lepsze rozwiązanie. Wszystko działa dobrze, w tym sensie, że odbywa się segue i przed wywołaniem funkcji prepareForSegue.

Zdarza się jednak, że na iPadzie zmieniłem identyfikator seg-up na Popover. Teraz rzeczy działają częściowo, przejście jest wykonywane, ale funkcja prepareForSegue nie jest wywoływana, dlatego kontroler widoku docelowego nie jest skonfigurowany tak, jak powinien.

Co robię źle?

+0

Mam ten sam problem. viewdidload jest wywoływany, ale nie działa segue – 1dayitwillmake

Odpowiedz

20

Co odkryli do tej pory, jest to, że z każdym identyfikatorem Segue że nie jest popover są to wezwania wykonane przez iOS:

  • prepareForSegue (na kontrolerze źródło)
  • viewDidLoad (na kontrolerze docelowym)

natomiast w popover segue kolejność wywołania wynosi:

  • viewDidLoad (na kontrolerze docelowym)
  • prepareForSegue (na kontrolerze źródłowego)

tylko dlatego kładę całą moją logikę w viewDidLoad, sterownik nie został poprawnie zainicjowany, a trzask stało. To nie jest do końca prawdą, że nie jest wywoływana funkcja prepareForSegue. Prawda jest taka, że ​​otrzymałem wyjątek i błędnie mylę się, gdy nie jest wywoływany program prepareForSegue.

Nie mogłem umieścić wszystkiego w widokuWiaganieAby zadzwonić do CoreData i nie chciałem sprawdzać, czy obiekty były w porządku za każdym razem, gdy wyświetlany jest widok.

Jak to rozwiązałem? I stworzył inną metodę w kontrolerze docelowym

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

i zmianę sposobu prepareForSegue kontroler źródłowym:

-(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]; 

} 

nie wiem, czy to jest normalne zachowanie z popover, w każdym razie teraz wszystko działa.

+0

Twoja poprawka działała również dla mnie, więc to jest dziwny problem, ponieważ tylko mi się pojawił, mimo że mam kilka innych pop overów, które działają dobrze i polegają na prepareForSegue, aby przekazywać dalej obiekty. – GeoffCoope

+0

To samo tutaj, czasami prepareForSegue jest wywoływane przed viewDidLoad, czasami po ... Dzięki za poprawkę. –

+0

Myślę, że prepareForSegue jest wywoływana po viewDidLoad, gdy segue jest wywoływana ze Storyboard, i jest w inny sposób, jeśli wyzwolisz go ręcznie za pomocą -performSegueWithIdentifier :. – gklka

1

Zauważyłem, że kod płytkę kocioł na Xcode firmy Master-Detail szablonu (iPhone) wykorzystuje następujący wzór do konfigurowania pokazać detal VC:

  1. szczegółach ustawiaczy VC (dla nieruchomości) są zastępowane w aby wywołać metodę configureView (configureView zaktualizowałby wszystkie kontrolki w widoku, np. etykiety itp.)
  2. szczegóły metoda VC viewDidLoad wywołuje również metodę configureView

nie postępował zgodnie ze schematem na drugi dzień, kiedy starałem się ponownie wykorzystać szczegół VC w moim filmowym aplikacji, a to dało mi problemy .

Nie mam dużego doświadczenia z popover; jednak, jeśli powyższy wzór jest używany z VC szczegółów, który jest wyświetlany wewnątrz popover, to czy widok szczegółów VC nie zostanie skonfigurowany po ustawieniu właściwości szczegółów VC z metody prepareForSegue?

Powiązane problemy