Вопрос

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

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

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

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

Пример

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

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

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

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

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

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

Есть ли разумные причины?Неужели я иду по этому пути неправильно?

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top