Переполнение NavigationController - PullRequest
0 голосов
/ 06 июля 2011

Я разработал и создал игру на основе UINavigationController.У меня есть несколько ViewControllers, как на картинке.Вы выбираете NewGame из RootVC, и вы готовы играть.После окончания вы просите перейти к следующей доске в NextBoardVC.После 10 досок вы переходите на следующий уровень от NextLevelVC.Есть 5 уровней.Каждый уровень содержит 10 досок.Проблема в том, что я нажимаю каждый ViewController, используя метод pushViewController.После 5 уровней у меня в стеке 52 виртуальных контура, а иногда и приложения.У меня нет утечек (протестировано Instruments)

Извините, у меня нет репутации, поэтому я не могу загрузить изображения с помощью stackoverflow.

Это изображение: http://imageshack.us/photo/my-images/641/navigationg.jpg/

Текстовое представление иерархии представления:

RootVC 
--OptionsVC
--HowToPlayVC
--NewGameVC
  --GameVC
    --NextBoardVC
      --NextLevelVC
        --GameVC
          --NextBoardVC
              --NextLevelVC
                --GameVC
                  --NextBoardVC
                    --NextLevelVC
                      --GameVC
                        --... and so on many times

Есть ли лучший способ сделать навигациюи устранить сбои?

Ответы [ 3 ]

2 голосов
/ 06 июля 2011

Почему бы вам просто не отпустить контроллеры вместо того, чтобы просто надвигать все больше и больше контроллеров сверху, особенно в тех точках, где вы возвращаетесь в своем "цикле"?

0 голосов
/ 06 июля 2011

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

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

Точно так же вам нужно вытолкнуть существующий BoardVC или LevelVC из стека, прежде чем нажимать следующий.

(Ключ: здесь -> означает нажатие, а <- означает всплывающее окно) </p>

Чтобы настроить первый уровень новой игры, вы должны:

RootVC-->NewGameVC-->GameVC-->BoardVC-->LevelOneVC

... а затем добавить следующий уровень, который вы сначала:

RootVC-->NewGameVC-->GameVC-->BoardVC<--LevelOneVC

... чтобы получить:

RootVC-->NewGameVC-->GameVC-->BoardVC

... а затем:

RootVC-->NewGameVC-->GameVC-->BoardVC-->LevelTwoVC

... повторить для всех остальных уровней. Вы можете сделать то же самое для каждого BoardVC по мере необходимости.

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

RootVC-->NewGameVC-->GameVC-->BoardVC-->LevelOneVC-->LevelTwoVC

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

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

0 голосов
/ 06 июля 2011

Не забывайте, что вы можете напрямую устанавливать контроллеры представления в стеке навигации, используя setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated.

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

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