Как выполнить переход от корневого контроллера представления до последнего контроллера представления в стеке навигации в Swift? - PullRequest
0 голосов
/ 04 мая 2018

enter image description here

У меня есть 3 контроллера View, встроенных в стек контроллера навигации. RedVC, BlueVC и YellowVC. В каждом контроллере вида есть кнопка, которая вызовет переход

из RedVC, я хочу перейти либо к BlueVC, либо к YellowVC. Все переходы от RedVC к BlueVC и к YellowVC подключаются с помощью push-show segue, а не модально.

Нет проблем, если маршрут такой: RedVC -> BlueVC -> YellowVC

но если я перейду с show segue из redVC непосредственно в YellowVC, кнопка «Назад» в YellowVC перенаправит меня обратно в RedVC

enter image description here

Я хочу, если я переключаюсь с RedVC на YellowVC, я хочу, чтобы кнопка «Назад» в YellowVC направляла меня в BlueVC, а не в RedVC.

как этого добиться?

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

Да, вы можете вставить blueVC в методе prepareForSegue. Вы можете следовать ниже код

override func performSegueWithIdentifier(identifier: String?, sender: AnyObject?) {
         super.performSegueWithIdentifier(identifier, sender: sender);

         if identifier == "xyz" {
            var navArray : [AnyObject]! = self.navigationController!.viewControllers
            navArray.insert(blueVC, atIndex: navStackArray.count - 2)
            self.navigationController!.setViewControllers(navArray, animated:false)
         }
     }

Выше, blueVC, вы должны поместить этот объект в ящик и положить туда. Надеюсь, что это поможет!

0 голосов
/ 04 мая 2018

Если вы хотите перейти от RedVC к YellowVC напрямую (пропуская BlueVC ), это исключит возможность BlueVC инициализируется. Таким образом, когда вы будете выполнять обратную навигацию с YellowVC , вам придется принудительно инициализировать BlueVC для достижения того, что вы хотите.
Хотя это не рекомендуется, так как он не будет следовать жизненному циклу VC по умолчанию. Но если вы хотите сделать это, вам нужно явно позаботиться о поведении. Как пример - постоянные данные.

0 голосов
/ 04 мая 2018

Одним из решений является добавление еще одного неанимированного перехода между красным и синим.

Снимите флажок «Анимация» в инспекторе свойств.

enter image description here

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

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

enter image description here

Чтобы перейти к желтому цвету, создайте свои синие и желтые ВК:

let storyboard = UIStoryboard.main!
let blue = storyboard.instantiateViewController(withIdentifier: "Blue")
let yellow = storyboard.instantiateViewController(withIdentifier: "Yellow")

А затем нажмите синий неанимированный, а затем желтый анимированный:

    navigationController?.pushViewController(blue, animated: true)
    navigationController?.pushViewController(yellow, animated: false)
0 голосов
/ 04 мая 2018

Если вы переходите с RedVC на YellowVC, поэтому вы не можете вернуться в BlueVC после нажатия на yellowVC.

Но этого можно достичь так:

Сохраните переменную флага с именем: shouldShowYellowDirectly в BlueVC и установите ее значение true и из RedVC в prepareForSegueMethod.

В BlueVC сделайте это:

override func viewDidLoad() {
        super.viewDidLoad()

   if shouldShowYellowDirectly{
    performSegue(withIdentifier: "showYellow", sender: self)
   }
}

В течение доли секунды будет отображаться BlueVC.

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