iPhone - UINavigationController, повторно использовать представления?

StackOverflow https://stackoverflow.com/questions/1623271

Вопрос

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

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

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

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

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

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

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

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

Решение

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

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

Другие советы

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

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

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