2011-12-27 24 views
6

Estoy desarrollando una aplicación con un UINavigatorController. Estoy usando el método viewDidAppear en el segundo viewController para buscar información en un servidor externo.viewDidAppear llamado dos veces en iOS5

Bien. Mientras que en IOS5 funcionó bien al principio, me di cuenta que no estaba siendo viewDidAppear llama en iOS4.3 por lo que poner este código en la raíz:

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

A partir de entonces, se inició la aplicación funcione correctamente en iOS4.3. Sin embargo, en iOS5 no lo hizo porque está llamando dos veces a viewDidAppear (la que se llamaba al principio y la del navigationController:didShowViewController:animated:)

¿Qué debo hacer para haber llamado solo una vez viewDidAppear?

Muchas gracias

+0

Probablemente debería solucionar el problema subyacente. ¿Estás haciendo algo inusual al presionar el controlador de vista? –

+0

No Firoze, lo he intentado todo, pero viewDidAppear y viewWillAppear no se invocan en ningún viewController del NavigationController. Tengo un UITabViewController y un UINavigationController dentro de la primera pestaña que carga varios ViewControllers – Ibai

+0

Para ser honesto, cada vez que he visto un proyecto donde esos métodos de ciclo de vida no eran confiables, era debido a errores comunes en la estructura o presentación de el controlador de contenedor. Haga que alguien mire ese código. Estoy seguro de que puedes hacer que funcione de manera consistente en ios4 sin cortes graciosos. –

Respuesta

1

comprobar la versión de los IOS el usuario está ejecutando mediante el uso de [[UIDevice currentDevice] sistemaVersión]; y en caso de que sea 4.3, llame al método viewDidAppear.

+2

¿No está un poco sucio? Sé que podría resolverlo de esa manera, pero creo que debería haber algo más correcto. – Ibai

+0

@Ibaivi - a veces solo tienes que hacer estas cosas. –

+0

En lugar de buscar la versión con 'systemVersion', compruebe mejor la existencia de una clase, o una clase que responda a un selector que se agregó en el sistema operativo al que desea apuntar. – pgb

-1

No debe llamar al viewDidAppear: manualmente, déjelo en UIKit para llamarlo por usted. Si elimina la llamada manual, debe llamarse solo una vez.

+0

Y estaba llamando solo una vez en iOS5 pero si hago eso, viewDidAppear no se llamará en iOS4.3 ... – Ibai

0

Si lo llaman dos veces y solo pudo realizar la llamada cuando agregó el código a la navegación raíz, ¿por qué no quita el código de viewDidAppear (el primero que creó que funcionó en iOS5) y lo deja solo? el que funcionó tanto en 4.3 como en 5?

4

La única solución real que veo (o más bien una solución para iOS 4.x) si establece algún tipo de estado en su vista Llamada de aparición y verifica si se ha configurado o no en llamadas posteriores, p.

-(void)viewWillAppear:(BOOL)animated { 
    if (!viewWillAppearCalled) { 
     viewWillAppearCalled = YES; 

     /* do stuff */ 
    } 
} 

A continuación, puede llamar de forma manual para la compatibilidad con iOS 4.x.

Lo mismo se puede hacer para viewDidAppear, viewWillDisappear y viewDidDisappear.

2

Probablemente tenga otro problema (por qué no se está llamando a viewDidAppear en iOS 4).

Sin embargo, encontré la inconsistencia entre iOS 5 e iOS 4 a este respecto también porque utilicé un controlador de vista de contenedor personalizado (ni UINavigationController ni UITabBarController). La solución para restaurar la compatibilidad de iOS 4 era implementar el siguiente método en el controlador de vista de contenedor:

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers { 
    return NO; 
} 
Cuestiones relacionadas