iPhone - UINavigationController, повторно использовать представления? - PullRequest
3 голосов
/ 26 октября 2009

Основной вопрос заключается в том, «сколько UIViewControllers вы можете добавить в стек навигации?» не вызывая предупреждения памяти или не зарабатывая сторожевой таймер.

Предположим, у меня есть приложение, которое в основном представляет собой базу данных для трех сущностей, где каждая может иметь связь с какой-то другой сущностью, и эта связь показана на UIViewController. Пользователи могут следовать этим отношениям, и каждый из них вызывает новый контроллер - если объектами являются A, B и C и A-> B-> C-> B-> C-> A, тогда каждый вид представления находится в стеке дважды , Я понимаю, как нажимать и извлекать, как возвращаться к определенному контроллеру, и я думаю, что вместо того, чтобы просто расширять стек навигации до бесконечности, лучше использовать контроллер представления в стеке навигации.

Чтобы сделать это, каждый раз, когда мне нужен был FirstEntityViewController, я мог сканировать стек навигации, чтобы найти объект, где [self isKindOfClass:[FirstEntityViewController class]];, а затем вызывать методы, предназначенные для перенастройки этого представления для того, что я в данный момент хочу видеть, - просто обновляя данные в так же, как при повторном использовании UITableViewCell.

Это хорошо, за исключением эффекта, который он может оказать на NavigationController. Если я использую UINavigationController:popToViewController:animated:, я думаю, что будет отброшено все, что выше представления, к которому я обращаюсь, включая представление, которое пользователь ожидает найти, нажав «Назад» на панели навигации. Таким образом, пользователь перебирает отношения, переходит назад и говорит «а?»

Если я удаляю соответствующий контроллер из стека навигации, а затем вставляю его в верхнюю часть стека, поведение «назад» остается в порядке, пока пользователь не вернется так далеко, как экземпляр FirstEntityViewController, который был перемещен или иначе опять навигация покажется противоречивой.

Является ли правильным решением удалить контроллер из стека и каким-то образом удерживать место в стеке, чтобы при извлечении повторно использованного контроллера его можно было вернуть обратно туда, откуда он пришел? Должен ли я вести свой собственный список видов и отображения данных, чтобы при выводе на экран я мог заменить представление под представлением, которое должно появиться, оставаясь на шаг впереди от обратной навигации?

Или это слишком сложно? Не нужно ли даже беспокоиться об этой ситуации, потому что ОС многократно использует большую часть контроллеров представлений так же, как многократно используются UITableViewCells, и при использовании стека навигации с глубиной 50 не влияет реальная память или производительность?

Ответы [ 2 ]

4 голосов
/ 26 октября 2009

Экземпляры ViewController остаются в стеке UINavigationController, но любое представление, кроме вида сверху, может быть выгружено в любое время (контроллер представления уведомляется через сообщение viewDidUnload).

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

0 голосов
/ 26 октября 2009

В последний раз я проверял, что вы не можете снова вставить на него контроллер представлений, который уже находится в стеке navcontroller. Вам нужно будет создать новый viewcontroller и поместить его в стек, и каждая кнопка «назад» вытолкнет его из стека. Лучшее, что вы можете сделать, - это создать кеш контроллеров представления и распределять их по мере необходимости - до тех пор, пока они извлекаются из стека navcontroller. Но это, вероятно, не принесет вам большой пользы благодаря экономии памяти.

UITableViews немного отличаются тем, что в каждый момент времени отображается только относительно небольшое количество ячеек, и как только ячейка выходит за пределы экрана, она удаляется и возвращается в пул. Если вы можете гарантировать, что максимальная глубина вашей цепочки фиксирована, то вы можете использовать аналогичную схему управления окнами. Если нет, то вам, возможно, придется придерживаться углубления и быть бдительным в освобождении памяти, как только сможете.

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