Forcer le chargement / déchargement d'une vue
-
22-07-2019 - |
Question
Comment puis-je configurer un contrôleur de vue pour actualiser les champs de la vue uniquement lorsque ce dernier est poussé sur un contrôleur de navigation et libère les objets lorsqu'il est extrait des vues du contrôleur de navigation.
Mon objectif est que, pour un contrôleur de vue:
- Actualiser l'affichage uniquement lorsqu'il est placé sur la pile de contrôleurs de navigation
- libère les données lorsqu'elles sont extraites de la pile de contrôleurs de navigation
- réutilisez autant que possible le contrôleur (pour éliminer les temps de chargement / déchargement des fichiers xib)
Existe-t-il des méthodes de délégation pour viewWillBePushed:
et viewWillBePopped:
?
Exemple
Disons que j'ai trois couches de vues:
Movies (MovieListController)
--> Movie Basic Info (MovieInfoController)
--> Movie Credits (MovieCreditsController)
Supposons que nous ayons une classe Film
pour représenter chaque film.
Ici, je veux seulement avoir trois UIViewController
, une instance de chacun dans le runtime du programme. Je peux donc réutiliser le même MovieInfoController
pour différents films et de la même manière MovieCreditsController
.
Cependant, je voudrais aussi que MovieInfoController
ne mette à jour que ses champs d'affichage (titre, date de publication, etc.) uniquement lorsqu'il est placé dans la pile. L'implémentation de l'affichage dans viewWillAppear
l'obligera à mettre à jour les champs, même si MovieCreditsController
est affiché.
De plus, je souhaite que MovieInfoController
libère sa référence dans Film
, lorsqu'il est affiché, ainsi que tout objet potentiellement volumineux (par exemple, l'image de couverture). Si vous implémentez cette logique dans viewWillDisappear
, les données seront libérées lorsqu’il insère MovieCreditsController
dans la pile.
Y at-il raisonnable? Est-ce que je m'y prends mal?
La solution
Vous y êtes à 90% parce que vous avez créé un objet Movie. MovieListController doit posséder un seul MovieInfoController. Il doit appeler -setMovie:
avant de le pousser sur le contrôleur de navigation. L’appel à -setMovie:
devrait être ce qui met à jour vos champs.
De même, MovieInfoController doit posséder un seul MovieCreditsController et appeler -setMovie:
avant de le placer sur le contrôleur de navigation.
Dans MovieListController et MovieInfoController, vous pouvez appeler [subController setMovie: nil]
dans leur -viewDidAppear:
pour libérer de la mémoire.