Forza il caricamento / scaricamento di una vista
-
22-07-2019 - |
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:
- Aggiorna la visualizzazione solo quando viene inserita nello stack del controller di navigazione
- rilascia i dati quando vengono estratti dallo stack del controller di navigazione
- 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?
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.