Força de carga / descarga de uma vista
-
22-07-2019 - |
Pergunta
Como posso configurar um controlador de vista para atualizar os campos na vista só ele é empurrado em um controlador de navegação e libera os objetos quando é estalado a partir de vistas do controlador de navegação.
Meu objetivo é que para um controlador de vista:
- exibição de atualização só quando é empurrado na navegação controlador de pilha
- dados libera quando é estalado a partir da navegação controlador de pilha
- reutilizar o controlador tanto quanto possível (para eliminar arquivos xib de carga / descarga em cima)
Existem métodos delegado para viewWillBePushed:
e viewWillBePopped:
?
Exemplo
Vamos dizer que tenho três camadas de pontos de vista:
Movies (MovieListController)
--> Movie Basic Info (MovieInfoController)
--> Movie Credits (MovieCreditsController)
Suponha que tenhamos um Movie
classe para representar cada filme.
Aqui, quero apenas para ter três UIViewController
s, uma instância de cada no tempo de execução do programa. Para que eu possa reutilizar o mesmo MovieInfoController
para diferentes filmes e semelhante MovieCreditsController
.
No entanto, eu também gostaria MovieInfoController
atualizar apenas seus campos de visualização (por exemplo, título, data de lançamento, etc) somente quando ele é empurrado na pilha. Implementando a exibição em viewWillAppear
vai forçá-lo a atualizar os campos, mesmo quando MovieCreditsController
é estalado.
Além disso, quero MovieInfoController
para liberar sua referência a Movie
, quando ele é estourado, e qualquer (por exemplo imagem cover) potencialmente grande objeto. Implementar esta lógica em viewWillDisappear
fará com que ele libere os dados quando é empurrando MovieCreditsController
na pilha.
Existe razoável? Am I indo pelo caminho errado?
Solução
Você está 90% lá, porque você criou um objeto de filme. MovieListController deve possuir um único MovieInfoController. Ele deve chamar -setMovie:
antes de empurrá-lo para o controlador de navegação. A chamada para -setMovie:
deve ser o que atualiza seus campos.
Da mesma forma, MovieInfoController deve possuir um único MovieCreditsController, e deve chamar -setMovie:
sobre ela antes de empurrá-lo para o controlador nav.
Em MovieListController e MovieInfoController, você pode chamar [subController setMovie:nil]
em sua -viewDidAppear:
para liberar memória.