如何从根视图控制器执行segue到swift导航堆栈中的最后一个视图控制器?

时间:2018-05-04 06:11:59

标签: ios swift uinavigationcontroller

enter image description here

我有3个嵌入在导航控制器堆栈中的View控制器。 RedVC,BlueVC和YellowVC。在每个视图控制器中都有一个按钮,它将触发segue

从RedVC

,我想导航到BlueVC或YellowVC。所有从RedVC到BlueVC和YellowVC的segue都是使用push show segue连接的,不是模态的。

如果路线是这样的话没有问题: RedVC - > BlueVC - > YellowVC

但如果我将show segue从redVC直接推送到YellowVC,YellowVC中的后退按钮会将我引回RedVC

enter image description here

我想,如果我从RedVC转到YellowVC,我希望YellowVC中的后退按钮将我引导到BlueVC,而不是RedVC。

如何实现这一目标?

4 个答案:

答案 0 :(得分:0)

如果您从RedVC转移到YellowVC,那么在点击yellowVC后您将无法返回BlueVC。

但这可以通过以下方式实现:

在BlueVC中保留一个名为shouldShowYellowDirectly的标志变量,并在prepareForSegueMethod中设置其值true和RedVC。

在BlueVC中执行此操作:

override func viewDidLoad() {
        super.viewDidLoad()

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

它将显示BlueVC的秒数。

答案 1 :(得分:0)

如果您要直接从 RedVC 迁移到 YellowVC (跳过 BlueVC ),它将排除 BlueVC的可能性初始化。因此,当您从 YellowVC 执行返回导航时,您必须强制初始化 BlueVC 以实现您想要的效果。
虽然这不可取,因为它不会遵循默认的VC生命周期。但是如果你这样做,你需要明确地处理这种行为。例如 - 持久化数据。

答案 2 :(得分:0)

一种解决方案是在红色和蓝色之间添加另一个非动画 segue。

取消选中" Animates"属性检查器中的复选框。

enter image description here

要转到黄色,请先执行此segue并传递一个true标志,指示我们是否将黄色变为蓝色。蓝色,处理此标志。如果该标志为true,则将动画segue设置为黄色。如果我们只是蓝色,将执行动画segue为蓝色,标志将为false

另一个解决方案是以编程方式执行此操作而不使用segues。给你的蓝色和黄色VC一些标识符:

enter image description here

要转到黄色,请实例化您的蓝色和黄色VC:

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)

答案 3 :(得分:0)

是的,您可以在prepareForSegue方法中插入blueVC。您可以按照以下代码

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你需要创建该对象并放在那里。希望这有帮助!