Принудительная загрузка/выгрузка вида
-
22-07-2019 - |
Вопрос
Как я могу настроить контроллер представления так, чтобы обновлять поля в представлении только тогда, когда он запускается на контроллере навигации и освобождает объекты, когда он извлекается из представлений контроллера навигации.
Моя цель состоит в том, чтобы для контроллера представления:
- Обновляйте дисплей только тогда, когда он помещен в стек навигационного контроллера
- освобождает данные, когда они извлекаются из стека навигационного контроллера
- используйте контроллер как можно чаще (чтобы исключить накладные расходы на загрузку / выгрузку xib-файлов).
Существуют ли какие-либо методы делегирования для viewWillBePushed:
и viewWillBePopped:
?
Пример
Допустим, у меня есть три уровня представлений:
Movies (MovieListController)
--> Movie Basic Info (MovieInfoController)
--> Movie Credits (MovieCreditsController)
Предположим, у нас есть класс Movie
представлять каждый фильм.
Здесь я хочу иметь только три UIViewController
s, по одному экземпляру каждого из них во время выполнения программы.Так что я могу повторно использовать то же самое MovieInfoController
для разных фильмов и аналогично MovieCreditsController
.
Однако я также хотел бы MovieInfoController
обновлять только его поля просмотра (например,название, дата выпуска и т.д.) только тогда, когда оно помещено в стек.Реализация отображения в viewWillAppear
заставит его обновлять поля, даже когда MovieCreditsController
выскакивает.
Кроме того, я хочу MovieInfoController
опубликовать его ссылку на Movie
, когда он выскакивает, и любой потенциально крупный объект (напримеризображение на обложке).Реализация этой логики в viewWillDisappear
приведет к тому, что он выпустит данные, когда он нажимает MovieCreditsController
в стопке.
Есть ли разумные причины?Неужели я иду по этому пути неправильно?
Решение
Вы на 90% там, потому что вы создали объект Movie.MovieListController должен владеть одним MovieInfoController.Это должно вызвать -setMovie:
перед тем, как вставить его в навигационный контроллер.Призыв к -setMovie:
должно быть то, что обновляет ваши поля.
Аналогично, MovieInfoController должен владеть одним MovieCreditsController и должен вызывать -setMovie:
на нем, прежде чем вставить его в навигационный контроллер.
В MovieListController и MovieInfoController вы можете вызвать [subController setMovie:nil]
в их -viewDidAppear:
чтобы освободить память.