J'ai un tabBarController avec deux onglets, dont le premier contient une instance de NavigatorController. Le navigateur navigator est initié avec un viewController personnalisé "peersViewController" qui répertorie tous les homologues réseau sur un tableauView. Lors de la sélection d'un homologue, une instance de "FilesListViewController" (liste des fichiers dans le répertoire c: \) est poussée dans la pile navigationController.UINavigationController popToRootViewController, puis immédiatement pousser une nouvelle vue
Dans ce fichier ListListViewController, j'ai un bouton pour le laisser naviguer vers le répertoire des documents. Pour ce faire, j'avais câblé l'interface pour appeler un gotoDirectory: (NSString *) Méthode de chemin dans le 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];
}
Cependant, lorsque j'appuie sur ce bouton, la NavigationController ne pop mon point de vue sur le contrôleur de vue racine , mais le FilesListViewController que j'ai instancié n'apparaissait pas. À partir du journal, je sais que la méthode personnalisée initWithFiles a bien été appelée et que des éléments réseau sont arrivés pour obtenir les noms de fichiers.
Quelque chose d'autre est vilain à ce sujet. J'ai essayé de cliquer sur le deuxième onglet, puis cliquez sur le premier onglet, et huala! les noms de fichiers dont j'avais besoin sont là. Il semble que les données et le fichier FilesListViewController aient bien été poussés dans la pile navigatorController, mais l'affichage n'a pas été rafraîchi mais bloqué à l'écran de rootViewController (peersViewController).
Est-ce que je fais quelque chose de mal?
--Ben.
- Modifié comme 15 minutes après avoir posté la question. J'avais trouvé une solution de contournement, mais cela me dérange que le pop et le push ne fonctionnent pas.
- (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];
}
Il ne de cette façon, et je l'aurais probablement devrait être contournée semble pas comme le NavigationController de libérer tous les viewControllers qui étaient dans la pile d'origine. Cela fonctionne cependant sur le simulateur iphone 3.0.
Si j'utilise ce code cependant, comment la libération de la mémoire devrait-elle être gérée? devrais-je obtenir l'original NSArray de viewcontrollers et libérer tout?
Ouais, vous avez besoin de pop sans animation (de sorte qu'il se passe tout de suite), puis appuyez sur l'animation. Si vous essayez de faire deux changements d'animation ensemble (ce qui prend du temps pour terminer) la vue sera dans un mauvais état. – Jason
Exactement comme décrit, cela ne fonctionne pas pour moi. Je pense que c'est un problème de synchronisation sur les changements de pile (le code d'animation d'Apple est très fragile, il est mal implémenté) - cette technique peut ou ne peut pas fonctionner selon la quantité d'écran restante. – Adam