Навигационный контроллер и заголовок для предыдущего экрана в навигации?

#iphone #objective-c #ios #xcode #uinavigationcontroller

#iPhone #objective-c #iOS #xcode #uinavigationcontroller

Вопрос:

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

Работает ли предыдущий экран (экран, на который нас выводит кнопка «Назад»)… есть ли у него название? (Как в предыдущей ОС ViewController что-то подобное)??

Моя цель, стоящая за этим вопросом:

Если у меня 5 экранов (1, 2, 3, 4, 5 соответственно)… допустим, я перемещаюсь с 1 -> 3, а в другом случае я перемещаюсь с 2 -> 3. Я хочу сказать, что если «PreviousViewController был 1», то перейдите от 3 к 4 (1 -> 3 -> 4), в противном случае, если предыдущий ViewController был равен 2, я хочу перейти к 3, чтобы 5 (2 -> 3 -> 5)…

Как мне выполнить что-то подобное?

Спасибо!

p.s. Я знаю, что мог бы также попробовать что-то разумное и логичное с другим подходом и просто pushViewController соответственно. Но если есть решение для проверки предыдущего ViewController, это упростило бы мою задачу и стало бы отличным опытом обучения.

Ответ №1:

На самом деле вы можете сделать это, используя viewControllers свойство UINavigationController . Вот что Apple говорит по этому поводу:

Корневой контроллер просмотра находится в массиве с индексом 0, контроллер заднего вида — с индексом n-2, а верхний контроллер — с индексом n-1, где n — количество элементов в массиве.

Ваш «предыдущий контроллер» — это то, что Apple определяет как «контроллер заднего вида», соответствующий индексу n-2:

 NSUInteger arraySize = [navController.viewControllers count];
UIViewController* prevController = [navController.viewControllers objectAtIndex:count-2];
  

Комментарии:

1. Это было потрясающе. Значит , я просто проверяю значение в массиве и принимаю свои решения соответствующим образом? Хотя это кажется простым, мне интересно, есть ли там какой-нибудь пример кода, чтобы я не допускал ошибок..

2. Документация Apple довольно ясна, поэтому вы должны быть в безопасности. Во всяком случае, я добавил небольшой образец.

3. Замечательный человек. Все работает. Последний вопрос. Могу ли я проверить что-то подобное? Если (prevController) является членом @class DateInfoViewController, то сделайте это; иначе сделайте это …. ?

4. вот оно: if ([prevController isKindOfClass:[DateInfoViewController class]]) . Если вы считаете, что этот ответ подходит для вашего вопроса, вы также можете принять его! 🙂

Ответ №2:

Нет, предыдущего ViewController не существует. UINavigationController реализован в виде стека, поэтому вы продолжаете нажимать контроллеры просмотра, и они могут сами выскакивать из стека.

К вашему сведению, если вы пытаетесь просмотреть весь стек viewcontrollers, то UINavigationController имеет свойство с именем «ViewControllers», которое реализовано как NSArray.

Комментарии:

1. Позвольте мне изложить свою цель за этим вопросом, чтобы вы могли сообщить мне о реализации.