2009-08-05 9 views
2

Comment puis-je configurer un contrôleur de vue pour actualiser les champs dans la vue uniquement s'il est enfoncé sur un contrôleur de navigation et libère les objets lorsqu'il est retiré des vues du contrôleur de navigation.Forcer le chargement/déchargement d'une vue

Mon objectif est que pour un contrôleur de vue:

  1. affichage Actualiser seulement quand il est poussé sur la pile du contrôleur de navigation
  2. diffuse les données quand il est sauté de la pile du contrôleur de navigation
  3. réutiliser la contrôleur autant que possible (pour éliminer les fichiers xib chargement/déchargement overhead)

Y at-il des méthodes de délégué pour et viewWillBePopped:?

Exemple

Disons que j'ai trois couches de vues:

Movies (MovieListController) 
    --> Movie Basic Info (MovieInfoController) 
     --> Movie Credits (MovieCreditsController) 

Supposons que nous avons une classe Movie pour représenter chaque film.

Ici, je veux seulement avoir trois UIViewController s, une instance de chacun dans le temps d'exécution du programme. Donc, je peux réutiliser le même MovieInfoController pour différents films et de même MovieCreditsController.

Cependant, j'aimerais aussi que MovieInfoController ne mette à jour ses champs de vue (par exemple titre, date de publication, etc.) que lorsqu'il est poussé sur la pile. L'implémentation de l'affichage dans viewWillAppear le forcera à mettre à jour les champs même lorsque MovieCreditsController est sauté.

En outre, je veux MovieInfoController pour libérer sa référence à Movie, quand il est sauté, et tout objet potentiellement volumineux (par exemple image de couverture). L'implémentation de cette logique dans viewWillDisappear l'amènera à libérer les données lorsqu'il pousse MovieCreditsController sur la pile.

Est-ce raisonnable? Est-ce que je vais dans le mauvais sens?

Répondre

1

Vous êtes à 90% car vous avez créé un objet Film. MovieListController devrait 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 devrait posséder un seul MovieCreditsController, et devrait appeler le -setMovie: dessus avant de le pousser 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.

+0

C'est en fait ce que je fais maintenant, sauf qu'il appelle 'drainFieldsInfo' au lieu de' setMovie: nil'. J'espérais quelque chose de mieux. Merci quand même! – notnoop

Questions connexes