Domanda

Come posso impostare un controller di visualizzazione per aggiornare i campi nella vista solo se viene spinto su un controller di navigazione e rilascia gli oggetti quando viene estratto dalle viste del controller di navigazione.

Il mio obiettivo è quello per un controller di visualizzazione:

  1. Aggiorna la visualizzazione solo quando viene inserita nello stack del controller di navigazione
  2. rilascia i dati quando vengono estratti dallo stack del controller di navigazione
  3. riutilizzare il controller il più possibile (per eliminare l'overhead di caricamento / scaricamento di file xib)

Esistono metodi delegati per viewWillBePushed: e viewWillBePopped: ?

Esempio

Diciamo che ho tre livelli di visualizzazioni:

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

Supponiamo di avere una classe Movie per rappresentare ogni film.

Qui, voglio avere solo tre UIViewController , un'istanza di ciascuno nel runtime del programma. Quindi posso riutilizzare lo stesso MovieInfoController per film diversi e allo stesso modo MovieCreditsController .

Tuttavia, vorrei anche MovieInfoController aggiornare solo i suoi campi di visualizzazione (ad es. titolo, data di rilascio, ecc.) solo quando viene inserito nello stack. L'implementazione del display in viewWillAppear lo costringerà ad aggiornare i campi anche quando MovieCreditsController viene visualizzato.

Inoltre, desidero che MovieInfoController rilasci il riferimento a Movie , quando viene visualizzato, e a qualsiasi oggetto potenzialmente grande (ad esempio immagine di copertina). L'implementazione di questa logica in viewWillDisappear causerà il rilascio dei dati quando sta spingendo MovieCreditsController nello stack.

C'è ragionevole? Sto andando nel modo sbagliato?

È stato utile?

Soluzione

Sei lì al 90% perché hai creato un oggetto Movie. MovieListController dovrebbe possedere un singolo MovieInfoController. Dovrebbe chiamare -setMovie: prima di spingerlo sul controller di navigazione. La chiamata a -setMovie: dovrebbe essere ciò che aggiorna i tuoi campi.

Allo stesso modo, MovieInfoController dovrebbe possedere un singolo MovieCreditsController e dovrebbe chiamarci -setMovie: prima di spingerlo sul controller di navigazione.

In MovieListController e MovieInfoController, puoi chiamare [subController setMovie: nil] nel loro -viewDidAppear: per liberare memoria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top