Принудительная загрузка/выгрузка представления

Как я могу настроить контроллер представления для обновления полей в представлении, только если он нажимается на контроллер навигации и освобождает объекты, когда он выталкивается из представлений контроллера навигации.

Моя цель заключается в том, что для контроллера представления:

  1. Обновлять отображение только тогда, когда оно помещается в стек навигационного контроллера.
  2. выпускает данные, когда они извлекаются из стека навигационного контроллера
  3. повторно использовать контроллер как можно больше (чтобы исключить накладные расходы на загрузку/выгрузку файлов xib)

Существуют ли какие-либо методы делегирования для viewWillBePushed: и viewWillBePopped:?

Пример

Скажем, у меня есть три слоя представлений:

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

Предположим, у нас есть класс Movie для представления каждого фильма.

Здесь я хочу иметь только три UIViewController, по одному экземпляру каждого во время выполнения программы. Так что я могу повторно использовать один и тот же MovieInfoController для разных фильмов и аналогично MovieCreditsController.

Однако я также хотел бы, чтобы MovieInfoController обновлял свои поля просмотра (например, название, дату выпуска и т. д.) только тогда, когда он помещается в стек. Реализация отображения в viewWillAppear заставит его обновлять поля, даже когда MovieCreditsController выталкивается.

Кроме того, я хочу, чтобы MovieInfoController освобождал свою ссылку на Movie при его извлечении и любой потенциально большой объект (например, изображение обложки). Реализация этой логики в viewWillDisappear приведет к освобождению данных при помещении MovieCreditsController в стек.

Есть ли разумный? Я иду об этом неправильно?


person notnoop    schedule 05.08.2009    source источник


Ответы (1)


Вы на 90% там, потому что вы создали объект Movie. MovieListController должен владеть одним MovieInfoController. Он должен вызвать -setMovie: перед тем, как отправить его на навигационный контроллер. Вызов -setMovie: должен обновлять ваши поля.

Точно так же MovieInfoController должен владеть одним MovieCreditsController и вызывать для него -setMovie: перед тем, как отправить его на навигационный контроллер.

В MovieListController и MovieInfoController вы можете вызвать [subController setMovie:nil] в их -viewDidAppear:, чтобы освободить память.

person Rob Napier    schedule 05.08.2009
comment
Это на самом деле то, что я делаю сейчас, за исключением того, что он вызывает drainFieldsInfo вместо setMovie:nil. Я надеялся на что-то лучшее. Спасибо хоть! - person notnoop; 06.08.2009