2010-01-27 21 views
5

I tienen los siguientes artículos en mi aplicación plumín:viewDidAppear: ¿no se dispara bajo ciertas condiciones?

  • los de siempre: el propietario del archivo, primera ventana de respuesta, delegan
  • View Controller "a"
    • Ver "b"
      • UIScrollView "c"
      • algunas otras cosas en "b"

En mi AppDelegate applicationDidFinishLaunching, hago esto:

  1. [ventana makeKeyAndVisible]
  2. [addSubview ventana: a.view];
  3. crear un controlador de vista "d"
  4. crear una "e" navigationController con RootViewController "d"
  5. invoke [c addSubview: e.view]

Pregunta/problema: cuando lo haga todo de lo anterior, viewDidAppear: no se activa para "d". (pero viewDidLoad está disparando.) ¿Cómo averiguo por qué no está disparando y lo arreglo para que se dispare?

(¿Por qué quiero usar viewDidAppear:. Lo anterior implica algunas animaciones encadenados y viewDidAppear parece un buen lugar para un controlador de vista para saber cuando su punto de vista ha sido cargado y animado, por lo que puede desencadenar animaciones posteriores)

Respuesta

10

Normalmente cuando se atornilla manualmente con la jerarquía de vista no obtendrá -viewWillAppear:, -viewDidAppear, etc .; son llamados por varios métodos SDK, como -pushViewController:animated:, -presentModalViewController:animated:, y por UITabBarController cuando se selecciona una pestaña.

Cuando agrega una vista a la jerarquía usted mismo, puede o no estar en pantalla o ir a estar en pantalla; el método -addSubview: no hace suposiciones sobre sus intenciones. Simplemente llámalos a medida que agrega la vista.

+0

marcado este como una respuesta como la explicación tiene sentido. Todavía tengo algunos bloqueos con animaciones (sin fallas sin ellos), pero probablemente debido a otras extrañezas no relacionadas en mi código. – Jaanus

3

Lo primero que debe tener en cuenta es que viewDidAppear es un método de UIViewController y no de UIView, realmente no tiene nada que ver con las vistas.

Lo segundo es que solo puede haber un UIViewController "activo" a la vez.

Cuando agrega la vista "a" a la ventana, se convierte en el UIViewController activo y solo "a" recibirá el mensaje viewDidAppear mientras que "e" no recibirá ningún método relacionado con UIViewContoller (viewDidAppear, viewWillAppear, etc. .)

Como @Noah mencionó cuando usa pushViewController, recibirá estos mensajes porque el método hace que el controlador de vista presionado se convierta en el "activo" UIViewController.

Mi sugerencia para usted es que si crea controladores para las vistas que son subvistas no subclasifique UIViewController sino más bien NSObject, reducirá su nivel de confusión ya que no esperará que sus métodos UIViewController llamen a los que ganaron ' t de todos modos.

+1

Tuve un problema aquí donde se llamó a viewDidAppear en los dispositivos iOS5 pero no en los dispositivos iOS4. Usando un controlador de navegación, desde el controlador A estaba presionando el controlador B de una manera bastante normal. No estoy seguro de si eso tiene sentido, pero también estoy almacenando una referencia al controlador B dentro del controlador A (normalmente dejo que el controlador de navegación mantenga la pestaña en los controladores). Estaba confiando en algún código dentro de viewDidAppear en el controlador B para disparar tan pronto como se muestra, pero sí se rompió en iOS 4.3 al menos. Dejé de usar viewDidAppear y acabo de hacer un '- (void) start;' en el controlador B para llamar después de presionar. – Jonny

1

Tuve un problema similar cuando configuré el delegado de mi controlador de navegación. Así que en mis métodos UINavigationControllerDelegate, hice algo como esto:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    //do something here 
    [viewController viewWillAppear:animated]; 
} 

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    [viewController viewDidAppear:animated]; 
} 
Cuestiones relacionadas