Tengo un tabBarController con dos pestañas, la primera de las cuales contiene una instancia de NavigatorController. El navegadorController se inicia con un viewController personalizado "peersViewController" que enumera todos los pares de red en un tableView. Al seleccionar un par, se inserta una instancia de "FilesListViewController" (que lista los archivos en el directorio c: \) en la pila de navigationController.UINavigationController popToRootViewController, y luego empujar inmediatamente una nueva vista
En este filesListViewController tengo un botón para que navegue para decir el directorio de documentos. Para ello había Telegrafié la interfaz para llamar a un gotoDirectory: (NSString *) método de la ruta en el 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];
}
Sin embargo, cuando se presiona el botón, el navigationController hizo estallar mi punto de vista al controlador de vista raíz , pero entonces el FilesListViewController que instalé no apareció. Del registro, sé que el método personalizado initWithFiles fue realmente llamado y que cosas de la red pasaron para obtener los nombres de los archivos.
Algo más es confuso sobre esto. Intenté hacer clic en la segunda pestaña y luego volver a la primera pestaña, ¡y huala! los nombres de archivo que necesitaba están allí. Parece que los datos y los archivosListViewController se insertaron en la pila navigatorController, pero la pantalla no se actualizó sino que se detuvo en la pantalla de rootViewController (peersViewController).
¿Estoy haciendo algo mal?
--Ben.
- Editado como 15 minutos después de publicar la pregunta. Encontré una solución alternativa, pero me molesta que pop y luego push no funcionen.
- (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];
}
No parece como el navigationController debe eludirse esta manera, y probablemente tendría que liberar a todos los viewControllers que estaban en la pila de originales. Sin embargo, esto funciona en el simulador de iPhone 3.0.
Sin embargo, si estoy usando este código, ¿cómo debería manejarse la liberación de memoria? ¿Debería obtener el NSArray original de viewcontrollers y liberar todo?
Sí, debe hacer pop sin animación (para que suceda de inmediato) y luego pulsar con animación. Si intenta hacer dos cambios de animación juntos (que llevará tiempo completar), la vista se pondrá en mal estado. – Jason
Exactamente como se describe, esto no funciona para mí. Creo que es un problema de tiempo en los cambios de pila (el código de animación de Apple es muy frágil, está implementado mal) - esta técnica puede funcionar o no dependiendo de cuánto más esté en la pantalla, al parecer. – Adam