La question fondamentale est "combien de UIViewControllers pouvez-vous pousser sur la pile de navigation?" sans provoquer d'avertissement de mémoire ou de gagner une fin de chien de garde.iPhone - UINavigationController, réutilisation des vues?
Supposons que j'ai une application qui est essentiellement une base de données pour trois entités où chacun peut avoir une relation avec une autre entité, et la relation est présentée sur une UIViewController. Les utilisateurs peuvent suivre ces relations et chacun d'eux amène un nouveau contrôleur - Si les entités sont A, B et C et A-> B-> C-> B-> C-> A, alors chaque type de vue est sur la pile deux fois . Je comprends comment pousser et sauter, comment repousser vers un contrôleur particulier, et je pense que plutôt que d'étendre indéfiniment la pile de navigation, il peut être préférable de réutiliser un contrôleur de vue dans la pile de navigation. Pour ce faire, chaque fois que je voulais un FirstEntityViewController, je pouvais scanner la pile de navigation pour trouver un objet où [self isKindOfClass:[FirstEntityViewController class]];
puis appeler des méthodes conçues pour redéfinir cette vue pour ce que je veux voir - juste rafraîchir les données dans le même comme vous le faites en réutilisant un UITableViewCell.
Ceci est bien, sauf pour l'effet qu'elle pourrait avoir sur le NavigationController. Si j'utilise UINavigationController:popToViewController:animated:
je pense qu'il va jeter tout ce qui précède la vue je popping à, y compris le point de vue que l'utilisateur attend à trouver sur les écoutes « Retour » dans la barre de navigation. Alors l'utilisateur tape une relation, tape en arrière et va "hein?"
Si je supprime le contrôleur correspondant de la pile de navigation, puis le place en haut de la pile, le comportement retour reste OK tant que l'utilisateur ne revient pas aussi loin que l'instance de FirstEntityViewController déplacée ou encore la navigation semblera incohérente.
Est-ce que la bonne solution est de retirer le contrôleur de la pile et de conserver une place dans la pile de sorte que lorsque le contrôleur réutilisé est déplacé, il peut être replacé d'où il vient? Devrais-je conserver ma propre liste de types de vue et d'affichage des données afin que je puisse remplacer la vue en dessous de la vue sur le point d'apparaître, en gardant une longueur d'avance sur la navigation arrière?
Ou est-ce juste être trop compliqué? Yat-il pas besoin de se soucier même de cette situation, car le système d'exploitation réutilise la plupart des contrôleurs de vue de la même manière que UITableViewCells sont réutilisés, et il n'y a pas de véritable effet mémoire ou la performance d'avoir une pile de navigation 50 profondeur?
On dirait qu'il y a deux questions: 1) combien de choses peuvent être sur la pile, et 2) une chose donnée peut-elle être sur la pile plus d'une fois? Droite? –
Sorte de. Combien de choses peuvent être sur la pile, définitivement. Est-ce qu'une chose donnée peut être sur la pile plus d'une fois? Je suis assez sûr que la réponse est oui, je suis juste préoccupé par l'impact (c'est-à-dire didReceiveMemoryWarning) de l'autoriser. La solution consiste peut-être à attendre cet avertissement de mémoire, puis à rechercher les entrées de pile à tuer, comme tout ce qui précède la dernière vue "importante". –