2011-12-27 7 views
6

Sto sviluppando un'applicazione con un UINavigatorController. Sto usando il metodo viewDidAppear nel secondo viewController premuto per trovare informazioni in un server esterno.viewDidAppear chiamato due volte in iOS5

Bene. Mentre in iOS5 ha funzionato bene all'inizio, mi sono reso conto che viewDidAppear non veniva chiamato in iOS4.3 così ho messo questo codice nella radice:

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

Successivamente, l'applicazione ha iniziato a funzionare correttamente in iOS4.3. Tuttavia, in iOS5 non perché ha chiamato due volte viewDidAppear (quello che veniva chiamato prima e quello da navigationController:didShowViewController:animated:)

Cosa devo fare per avere chiamato solo una volta viewDidAppear?

La ringrazio molto

+0

Probabilmente si dovrebbe risolvere il problema sottostante. Stai facendo qualcosa di insolito quando premi il controller della vista? –

+0

Nessun Firoze, ho provato tutto tranne ViewDidAppear e viewWillAppear non vengono chiamati in alcun viewController dal NavigationController. Ho un UITabViewController e un UINavigationController nella prima scheda che carica diversi ViewControllers – Ibai

+0

Per essere onesti, ogni volta che ho visto un progetto in cui quei metodi del ciclo di vita erano inaffidabili, era a causa di errori comuni nella struttura o nella presentazione di il controller del contenitore. Chiedi a qualcuno di guardare quel codice. Sono sicuro che puoi farlo funzionare in modo coerente in iOS4 senza hack divertenti. –

risposta

1

controllare quale versione di iOS l'utente esegue usando [[UIDevice currentDevice] VersioneSistema]; e nel caso sia 4.3, chiama il metodo viewDidAppear.

+2

Non è un po 'sporco? So che potrei risolverlo in questo modo ma penso che ci dovrebbe essere qualcosa di più corretto. – Ibai

+0

@Ibaivi: a volte devi solo fare queste cose. –

+0

Invece di cercare la versione usando 'systemVersion', è meglio controllare l'esistenza di una classe, o una classe che risponde a un selettore che è stato aggiunto al sistema operativo che si desidera targetizzare. – pgb

-1

Non dovresti chiamare viewDidAppear: manualmente, lasciare a UIKit chiamarlo per te. Se si rimuove la chiamata manuale, dovrebbe essere chiamata solo una volta.

+0

E stava chiamando solo una volta in iOS5, ma se faccio così, viewDidAppear non verrà chiamato in iOS4.3 ... – Ibai

0

Se viene chiamato due volte e si è stati in grado di effettuare la chiamata solo quando è stato aggiunto il codice alla navigazione di root, perché non rimuovere il codice da viewDidAppear (il primo che ha effettuato il lavoro su iOS5) e lasciare solo quello che ha funzionato sia in 4.3 che in 5?

4

L'unica soluzione reale che vedo (o meglio una soluzione alternativa per iOS 4.x) se si imposta qualche tipo di stato nella propria viewWillAppear-call e si verifica se è stato impostato o meno nelle chiamate successive, ad es.

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

     /* do stuff */ 
    } 
} 

Quindi è possibile chiamarlo manualmente per compatibilità con iOS 4.x.

La stessa cosa può essere eseguita per viewDidAppear, viewWillDisappear e viewDidDisappear.

2

Probabilmente hai un altro problema (perché viewDidAppear non viene chiamato su iOS 4).

Tuttavia, mi sono imbattuto nell'incoerenza tra iOS 5 e iOS 4 anche in questo caso perché ho utilizzato un controller di visualizzazione contenitore personalizzato (né UINavigationController né UITabBarController). La correzione per ripristinare la compatibilità di iOS 4 era quella di implementare il seguente metodo nel controller di visualizzazione contenitore:

- (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers { 
    return NO; 
}