Вы можете кешировать UIViewControllers? - PullRequest
0 голосов
/ 12 января 2011

У меня есть приложение с 8 UIViewControllers, представленными путем навигации слева / справа / вверх / вниз. Они создаются при запуске приложения и хранятся в NSArray. Только 1 из них добавляется в дерево представлений (addSubview :) в любое время - остальные просто остаются в кеше, пока они не понадобятся.

Теперь у меня проблема с поворотом на альбомную. Только видимый в настоящее время вид изменяет bounds.size на Landscape. При переходе к следующему представлению это представление все еще думает, что оно находится в книжной ориентации (но все содержащиеся виды будут выглядеть в альбомной ориентации)

Кстати, иерархия представлений в приложении следующая: UIWindow -> Main UIViewController -> 1 из 8 кэшированных UIViewControllers.

Например: * Изменить ориентацию: - Main UIViewController.view.bounds.size = 480x300 (ОК) - Один из кэшированных UIViewControllers view.bounds.size = 480x300 (ОК) * Перейти к следующему виду: - Main UIViewController.view.bounds.size = 480x300 (ОК), - Другой из кэшированных UIViewControllers view.bounds.size = 320x460 (??)

Не уверен, что происходит. Должен ли я как-то сообщать кэшированным UIViewControllers, что ориентация / размер изменились или что-то еще?

Большое спасибо

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Да, вы можете. Оптимально вы должны очистить представление, которым управляет каждый контроллер представления, когда он выходит за пределы экрана.

Просто присвойте nil свойству view заменяемого контроллера представления. Это освободит все ресурсы, используемые представлением, которое все равно не видно. В качестве дополнительного бонуса представление затем воссоздается с соответствующим кадром всякий раз, когда вы решаете снова принести определенный контроллер viw впереди.

Я также предполагаю, что то, что вы реализуете, является подклассом UIViewController, который действует как контейнер для других контроллеров представления. Как брат UITabController по имени CWGridController или подобный. Нет, родительский контроллер представлений (ваш подкласс) несет ответственность за изменение размера кадра его дочерних представлений контроллеров представления.

Создание контроллера представления контейнера - задача не из легких, и поддержка для этого не завершена со стороны Apple. Есть несколько вещей, которые вы должны сделать, включая, но не ограничиваясь:

  • Переадресация всех вызовов на изменение ориентации на все дочерние контроллеры представления.
  • Правильно вызывайте все появляющиеся / исчезающие на дочернем контроллере представления по мере необходимости.

Последняя часть, которая заставит это работать, - это нарушение некоторых правил. Контроллеры представления работают очень плохо, если они не знают об их родительском контроллере представления, расположение будет неправильным, и модальный контроллер представления ведет себя странно. К сожалению, parentViewController только для чтения, или вы так думаете. Его установка в любом случае с помощью KVC решит большинство проблем, и Apple, похоже, не возражает, когда вы отправляете в App Store:

[childViewController setValue:self forKey:@"parentViewController"];
0 голосов
/ 12 января 2011

В viewWillAppear вам нужно будет проверить ориентацию интерфейса и соответственно установить рамки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...