0

Я изменил навигацию в своем приложении с помощью UITabBarController на u UINavigationController. То есть прежнее решение (1-я версия) было основано только на TabBarController - 4 ViewControllers (один простой TableView, один простой пользовательский вид и один MapView со многими оверлеями). Вторая версия основана только на UINavigationController.Управление памятью при использовании NavigationController

В случае с TabBarController это было ясно и просто, все работало отлично, особенно MapView. Я имею в виду: MapView был загружен один раз (со значительным количеством наложений), и когда я перешел к другому представлению и вернулся к MapView, MapView все еще был там с уже загруженными и отображаемыми надписями (простая проверка: вызывается MapView`s viewDidLoad только один раз за запуск приложения, у меня там были отладочные сообщения).

Теперь я сменил навигационную логику на UINavigationController. Все работает отлично для первого взгляда, но: viewDidLoad (для каждого представления) вызывается каждый раз, когда я перехожу к представлению. Это особенно раздражает в случае MapView - загрузка наложений выполняется каждый раз, это занимает некоторое время, и в некоторых случаях это приводит к сбою приложения.

OK, мои вопросы:

  1. Является ли это своего рода "общего" поведения NavigationController?

  2. Могу ли я изменить это поведение, так что viewDidLoad будет вызываться только один раз?

  3. И многое другое - Как я могу повлиять на «последовательность отображения» некоторого вида?

Я понимаю, логика, вероятно, более сложный, но я ценю любой ответ или намек;)

Некоторые родственные обстоятельства:

  • TabBar и навигационные контроллеры не объединены.
  • Я использую раскадровки, segues разработаны в UIB, без ручного вызова, такого как perfomSegue или prepareForSegue в моем коде. Одна кнопка вызывает переход к MapView.
  • Я использую push segues.
  • Я также пытался использовать модальные сеги, но без каких-либо изменений в этом поведении.
  • любой из viewDidUnload никогда не вызывается во время segues среди просмотров.
  • Предупреждение о получении памяти не получено.
  • Отсутствие утечек памяти, измеренных как на симуляторе, так и на iPhone 4.
  • Я попытался создать очень простой временный проект/приложение, касающееся только Nav. Контроллер и другие виды без ЛЮБОГО кодирования, просто раскадровка. Это было одно и то же поведение.
  • Возникла проблема, вызывающая сбой приложения, когда я быстро и периодически постучал в навигационную кнопку и обратно между одним видом и MapView. В большинстве случаев приложение разбилось, когда я нажал кнопку «Назад» на MapView до того, как он был полностью отображен (т. Е. Его оверлеи). Это было исправлено, когда я добавил 1 сек. вызов метода задержки в viewDidDisappeared в MapView.Это не справедливо исправить, я знаю;)
+0

перед распределением класса карты, нажимая его на контроллер навигации, проверьте, равен ли его нуль, если nil затем распределяет его, а затем напрямую нажимайте класс карты на навигационном контроллере. – prasad

ответ

3

UITabBarController и UINavigationController основаны на принципиально различных парадигм.

UITabBarController предназначен для того, чтобы на каждой вкладке существовало независимо друг от друга и для пользователя, чтобы выбрать, что они хотят просмотреть. viewDidLoad получает только один раз для каждого UIViewController, потому что предполагается, что каждая вкладка все еще существует в памяти, даже когда пользователь переключается на другую вкладку.

UINavigationController представляет собой стек UIViewControllers, где каждый из них относится к одному выше и ниже. Верхняя часть UIViewController в стеке всегда является той, которая видна пользователю. Когда UIViewController помещается в стек, его viewDidLoad вызывается, потому что он загружается в память. Когда верхняя часть UIViewController выталкивается из стека, она выгружается из памяти, и viewDidUnload вызывается на выход (viewDidUnload устарел в iOS6 и не будет вызван, но контроллер все равно будет выгружен из памяти). Вот почему viewDidLoad вызывается каждый раз, когда пользователь нажимает конкретный UIViewController на стек UINavigationController.

+1

У вас есть опечатка - '-viewDidUnload' устарел в ios6, а не' -viewDidLoad' –

+0

Хороший улов! Теперь исправлено. Благодарю. –

+0

»и viewDidUnload вызывается на выходе« Нет, не будет, в pre-iOS 6. 'viewDidUnload' вызывается только при выгрузке представления. Вид выгружается только в ситуациях с низкой памятью. В 99% случаев вы никогда не увидите разгрузки. – newacct

Смежные вопросы