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:

  1. Actualiser l'affichage uniquement lorsqu'il est placé sur la pile de contrôleurs de navigation
  2. libère les données lorsqu'elles sont extraites de la pile de contrôleurs de navigation
  3. 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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top