Ho un tabBarController con due schede, la prima delle quali contiene un'istanza di NavigatorController. Il navigatorController viene avviato con un viewController personalizzato "peersViewController" che elenca tutti i peer di rete su una tabellaView. Dopo aver selezionato un peer, un'istanza di "FilesListViewController" (che elenca i file nella directory c: \) viene inserita nello stack navigationController.UINavigationController popToRootViewController, quindi premere immediatamente una nuova vista
In questo fileListViewController ho un pulsante che consente di navigare per dire directory dei documenti. Per fare questo avevo telegrafato l'interfaccia di chiamare un gotoDirectory: (NSString *) Metodo di percorso nel RootViewController:
- (void)gotoDirectory:(NSString*)path {
[[self navigationController] popToRootViewControllerAnimated:YES];
NSArray *files = [self getFilesFromPeerAtPath:path];
FilesListViewController *filesVC = [[FilesListViewController alloc] initWithFiles:files];
[[self navigationController] pushViewController:filesVC animated:YES];
[filesVC release];
}
Tuttavia, quando si preme il pulsante, il navigationController ha pop mio punto di vista al controller della vista di root , ma il FilesListViewController che ho istanziato non è stato visualizzato. Dal log, so che il metodo personalizzato initWithFiles è stato effettivamente chiamato e gli elementi di rete sono accaduti per ottenere i nomi dei file.
Qualcos'altro è un po 'strano. Ho provato a fare clic sulla seconda scheda e quindi a fare clic sulla prima scheda e su huala! i nomi dei file di cui avevo bisogno sono lì. Sembra che i dati e i fileListViewController siano stati effettivamente inseriti nello stack navigatorController, ma il display non è stato aggiornato ma bloccato sullo schermo di rootViewController (peersViewController).
Sto facendo qualcosa di sbagliato?
--Ben.
- Modificato come 15 minuti dopo aver postato la domanda. Avevo trovato una soluzione alternativa, ma mi disturba quel pop e poi push non funziona.
- (void)gotoDirectory:(NSString*)path {
PeersListViewController *rootViewController = (PeersListViewController*)[[[self navigationController] viewControllers] objectAtIndex:0];
[[self navigationController] setViewControllers:[NSArray arrayWithObject:rootViewController]];
FilesListViewController *filesVC = [[FilesListViewController alloc] initWithFiles:files];
[[self navigationController] pushViewController:filesVC animated:YES];
[filesVC release];
}
Non sembra come il navigationController dovrebbe essere aggirato in questo modo, e probabilmente sarei dovuto liberare tutti i viewControllers che erano nella pila originale. Questo tuttavia funziona con il simulatore di iPhone 3.0.
Se sto usando questo codice, come dovrebbe essere gestita la versione di memoria? dovrei ottenere l'originale NSArray di viewcontrollers e rilasciare tutto?
Sì, è necessario eseguire il pop senza animazione (in modo che avvenga immediatamente) e quindi premere con animazione. Se si tenta di eseguire due modifiche dell'animazione insieme (che richiedono tempo per il completamento), la vista si troverà in cattivo stato. – Jason
Esattamente come descritto, questo non funziona per me. Penso che sia un problema di temporizzazione sui cambi di stack (il codice di animazione di Apple è molto fragile, è implementato male) - questa tecnica può funzionare o meno a seconda di quanto altro sullo schermo, a quanto pare. – Adam