2009-08-05 8 views
2

Wie kann ich einen View-Controller einrichten, um die Felder in der Ansicht nur zu aktualisieren, wenn er auf einen Navigationscontroller gedrückt wird und die Objekte freigibt, wenn er aus den Ansichten des Navigationscontrollers herausgeklappt wird.Laden/Entladen einer Ansicht erzwingen

Mein Ziel ist es, dass für einen View-Controller:

  1. Refresh Anzeige nur, wenn es auf dem Navigationscontroller Stapel
  2. Mitteilungen Daten gedrückt wird, wenn es aus dem Navigationscontroller Stapel
  3. Wiederverwendung des geknallt wird Controller so viel wie möglich (XIB-Dateien Lade/Entlade-Overhead zu beseitigen)

Gibt es Delegate Methoden für viewWillBePushed: und viewWillBePopped:?

Beispiel

Lassen Sie uns sagen, ich habe drei Schichten der Ansichten:

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

Angenommen, wir haben eine Klasse Movie jeden Film zu repräsentieren.

Hier möchte ich nur drei UIViewController s haben, eine Instanz von jedem in der Laufzeit des Programms. So kann ich die gleiche MovieInfoController für verschiedene Filme und ähnlich MovieCreditsController wiederverwenden.

Allerdings möchte ich auch MovieInfoController nur seine Ansicht Felder (z. B. Titel, Veröffentlichungsdatum, etc.) nur aktualisieren, wenn es auf dem Stapel geschoben wird. Die Implementierung der Anzeige in viewWillAppear wird dazu führen, dass Felder aktualisiert werden, selbst wenn MovieCreditsController aufgerufen wird.

Auch ich möchte MovieInfoController, um seine Referenz auf Movie, wenn es Pop und jedes potenziell große Objekt (z. B. Titelbild) freigegeben werden. Die Implementierung dieser Logik in viewWillDisappear wird dazu führen, dass es die Daten freigibt, wenn es MovieCreditsController auf den Stapel schiebt.

Ist das vernünftig? Gehe ich falsch herum?

Antwort

1

Sie sind zu 90% dort, weil Sie ein Movie-Objekt erstellt haben. MovieListController sollte einen einzelnen MovieInfoController besitzen. Er sollte -setMovie: anrufen, bevor er auf den Navigationscontroller geschoben wird. Der Anruf an -setMovie: sollte sein, was Ihre Felder aktualisiert.

In ähnlicher Weise sollte MovieInfoController einen einzelnen MovieCreditsController besitzen und -setMovie: darauf aufrufen, bevor er auf den nav Controller geschoben wird.

In MovieListController und MovieInfoController können Sie [subController setMovie:nil] in ihrem -viewDidAppear: aufrufen, um Speicher freizugeben.

+0

Das ist eigentlich zu dem, was ich gerade mache, außer dass es 'drainFieldsInfo' anstelle von' setMovie: nil' heißt. Ich habe auf etwas Besseres gehofft. Trotzdem danke! – notnoop

Verwandte Themen