2012-03-29 3 views
10

Quando si implementa il contenimento di UIViewController, qual è l'ordine corretto dei seguenti messaggi che devo inviare, quando si scambia un controller figlio con un altro?Qual è l'ordine corretto dei messaggi di contenimento di UIViewController che devo inviare quando non si utilizza transitionFromViewController?

È come qui sotto, o è il mio ordine non corretto? Mi mancano i messaggi?

  • Aggiungi nuovo controller bambino di regolatore di corrente: addChildViewController:
  • Aggiungi visualizzazione secondaria del nuovo controller bambino di vista del regolatore di corrente: addSubview:
  • Run qualche passaggio di fantasia dal vecchio vista nuova vista.
  • Inform nuovo controller bambino che è stata aggiunta a un altro controller: didMoveToParentViewController:
  • Rimuovere vista del controller precedente dalla sua superview: removeFromSuperview:
  • Rimuovere il controller precedente bambino dal suo genitore: removeFromParentViewController:

EDIT: devo annotare che quanto sopra diventa solo una questione di non si sta utilizzando metodi di transizione di UIViewController ma piuttosto desidera aggiungere la nuova vista manualmente.

risposta

15

Ok, capito. È tutto nei documenti ma lo trovo abbastanza bene nascosto. Lo dividerò in tre casi perché penso che potrebbe aiutare gli altri. Perché lo sto rendendo così difficile invece di usare [UIViewController transitionFromViewController:toViewController:duration:options:animations:completion]? La risposta è che puoi utilizzare il metodo di transizione solo se esiste già un controller di visualizzazione esistente. Se si desidera passare da "nessun controller" a qualche controller o viceversa, il metodo precedente genererà un'eccezione.

Caso 1: Entrambi i controller sono uguali - che comprende che entrambi sono nulli

  • fare nulla, abbiamo già quello che vogliamo sullo schermo. :-)

Caso 2: Il vecchio controller è NULL, e il nuovo controller non è NULL. Basta aggiungere il nuovo controller.

  • Invia addChildViewController al nuovo controller - questo attiverà un implicito willMoveToParentViewController
  • Rendere la nuova vista le dimensioni desiderate
  • Inserire vista del controller bambino nella visualizzazione della gerarchia di questo controllore: addSubview
  • Informare regolatore di bambino che è stato aggiunto da bambino inviandolo: didMoveToParentViewController

Caso 3: vecchio controller non è NULL e nuovo controller non è NULL. Esegui una transizione tra i controller.

  • Regolare la cornice/i limiti della nuova vista.
  • Invia addChildViewController al nuovo controller - questo attiverà un implicito willMoveToParentViewController
  • Invia il vecchio regolatore willMoveToParentViewController e passarlo nil come il nuovo genitore
  • Aggiungere la nuova visualizzazione secondaria alla visualizzazione
  • Eseguire la transizione personalizzato tra il vecchia e nuova visualizzazione usando le animazioni UIView's.
  • Nel delegato di fine animazione, inviare didMoveToParentViewController al nuovo controller.
  • Rimuove la visualizzazione del vecchio controller dal suo superview.
  • Invia removeFromParentViewController al vecchio regolatore - questo attiverà un implicito didMoveToParentViewController
+0

cose utili. Grazie per averlo estratto per tutti :-) – poupou

+0

Amo questa risposta, ma ti manca un caso, passando da non nulla a nulla. Probabilmente non è il più frequente degli scenari, però. – RonLugge