2012-03-29 5 views
10

Al implementar la contención de UIViewController, ¿cuál es el orden correcto de los siguientes mensajes que debo enviar al intercambiar un controlador secundario con otro?¿Cuál es el orden correcto de los mensajes de contención UIViewController que debo enviar cuando no utilizo transitionFromViewController?

¿Es como a continuación o mi pedido es incorrecto? ¿Me faltan mensajes?

  • Agregar nuevo controlador niño a controlador de corriente: addChildViewController:
  • Añadir subvista del nuevo controlador niño a la vista del controlador de corriente: addSubview:
  • correr un poco de fantasía transición de la vieja a la vista nueva vista.
  • Informar nuevo controlador niño que se ha añadido a otro controlador: didMoveToParentViewController:
  • Eliminar vista del controlador anterior de su supervista: removeFromSuperview:
  • extraer el controlador anterior hijo de su padre: removeFromParentViewController:

EDITAR: Tengo que anotar que lo anterior solo se convierte en un problema de que no está utilizando los métodos de transición de UIViewController, sino que desea agregar la nueva vista manualmente.

Respuesta

15

Bien, lo descubrí. Está todo en los documentos, pero me parece bastante bien escondido. Lo dividiré en tres casos porque creo que podría ayudar a otros. ¿Por qué lo estoy haciendo tan difícil en lugar de usar [UIViewController transitionFromViewController:toViewController:duration:options:animations:completion]? La respuesta es que solo puede usar el método de transición si ya hay un controlador de vista existente. Si desea pasar de "sin controlador" a algún controlador o viceversa, el método anterior emitirá una excepción.

Caso 1: Ambos controladores son iguales - que incluye que ambos son nulos

  • No hacer nada, ya tenemos lo que queremos en la pantalla. :-)

Caso 2: El controlador de edad es NULL, y el nuevo controlador no es NULL. Solo agrega el nuevo controlador.

  • Enviar addChildViewController al nuevo controlador - esto desencadenará una implícita willMoveToParentViewController
  • Hacer la nueva vista del tamaño que desee
  • Insertar Vista del controlador niño en jerarquía de vistas de este controlador: addSubview
  • Inform controlador niño que se agregó como un niño enviándolo: didMoveToParentViewController

Caso 3: controlador antiguo no es NULO y el controlador nuevo no es NULO. Ejecuta una transición entre controladores.

  • Ajusta el marco/los límites de la nueva vista.
  • Enviar addChildViewController al nuevo controlador - esto desencadenará una implícita willMoveToParentViewController
  • Enviar el antiguo controlador de willMoveToParentViewController y pasarlo a cero como el nuevo padre
  • Añadir la nueva subvista a la vista
  • Ejecutar su transición a medida entre la antigua y la nueva vista usando UIView's animaciones.
  • En el delegado del extremo de la animación, envíe didMoveToParentViewController al nuevo controlador.
  • Elimina la vista del controlador anterior de su supervista.
  • Enviar removeFromParentViewController al antiguo controlador - esto desencadenará una implícita didMoveToParentViewController
+0

cosas útiles. Gracias por excavar para todos :-) – poupou

+0

Me encanta esta respuesta, pero te falta un caso, yendo de no nulo a nulo. Sin embargo, probablemente no sea el escenario más frecuente. – RonLugge

Cuestiones relacionadas