Принудительная загрузка / выгрузка вида - PullRequest
2 голосов
/ 06 августа 2009

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

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

  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 в стек.

Есть ли смысл? Я поступаю неправильно?

1 Ответ

1 голос
/ 06 августа 2009

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

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

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

...