Comment puis-je gérer la poussée sans fin des controllers de vue sur la stack du controller de navigation? iOS

J'ai une application qui est composée d'un UINavigationController qui pousse ViewControllers à partir de 3 tabs différents.

Le problème que je prévois est que la structure actuelle permet à l'user d'append sans cesse des VC sur la stack.

J'ai un onglet appelé produits pharmaceutiques et un autre appelé pathogènes. Si vous parsingz assez loin dans les produits pharmaceutiques, vous obtenez une list des agents pathogènes contre lesquels il est efficace et l'user peut sélectionner un agent pathogène pour voir plus d'informations à ce sujet. Cela provoque l'application à pousser un nouveau pathogenVC.

Maintenant, l'user peut accéder à la list des produits pharmaceutiques auxquels le pathogène est sensible et le sélectionner, ce qui provoque une nouvelle VC dans l'onglet pharmaceutique.

Ainsi de suite…

Chaque fois que 1,5 Mo supplémentaire est ajouté à l'empreinte memory.

Comment puis-je gérer au mieux cela?

Vous devriez vous concentrer sur la minimisation de votre empreinte memory en libérant des ressources que vous pouvez facilement recréer au lieu d'essayer d'empêcher l'user de pousser 100 controllers de vue sur votre stack. Apple ne le fait pas non plus.

Ouvrez l'application iTunes Store et searchz "Hugh Laurie", select l'album "Let Them Talk", puis "Hugh Laurie>", puis "Let Them Talk", puis "Hugh Laurie>" et ainsi de suite . Vous pouvez continuer et aller et venir. Lorsque l'user fait cela pendant très longtime, l'application va probablement manquer de memory et tomber en panne.

Si vous essayez de charger 20 tonnes de briques sur votre Toyota Pickup, il sera probablement écrasé comme un package de Capri Sun vide. C'est un comportement destructeur intentionnel et à mon humble avis, il est OK pour l'application de se terminer si l'user tente de le surcharger avec force.

entrez la description de l'image ici

Cependant, vous pouvez rendre ce point presque inaccessible et donc ce scénario très improbable en libérant de la memory dans vos controllers de vue hors écran. Implémentez didReceiveMemoryWarning (exemple: Comment implémenter didReceiveMemoryWarning? ) Pour libérer des choses que vous pouvez facilement recréer à partir du disque ou du réseau (images, objects Core Data, etc.). De cette façon, vous pouvez réduire votre empreinte memory et vos users ne pourront faire planter votre application que s'ils disposent de plusieurs heures et rien de mieux que de pousser les controllers de vue. Ce qui serait sortingste.

Vous pouvez implémenter votre propre sous-class UINavigationController . Vous devez implémenter au less pushViewController:animated: et popViewControllerAnimated: Au cours d'une poussée, vous supprimez l'un des controllers de vue (libérant ainsi la memory), et dans pop, vous le créez à nouveau, en utilisant datatables que vous gardez. Fondamentalement, vous passerez de garder la stack entière de controllers de vue à seulement quelques éléments, avec la logique de restaurer ceux qui se trouvent plus bas dans la stack.

Ceci est une description simplifiée. Dans l'application actuelle, vous devez conserver au less le controller de vue précédent, de sorte que votre button de return et le geste de return de balayage fonctionnent correctement.