繁体   English   中英

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

[英]how to perform segue from root view controller to the last view controller in the navigation stack in swift?

在此处输入图片说明

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

从RedVC,我想导航到BlueVC或YellowVC。 从RedVC到BlueVC到YellowVC的所有segue都使用推送显示segue连接,没有模态显示。

如果路由是这样,则没有问题:RedVC-> BlueVC-> YellowVC

但是如果我将show segue从redVC直接推到YellowVC,YellowVC中的“后退”按钮会将我定向回到RedVC

在此处输入图片说明

我想要,如果我从RedVC切换到YellowVC,我希望YellowVC中的“后退”按钮会将我定向到BlueVC,而不是RedVC。

如何做到这一点?

如果您要从RedVC迁移到YellowVC,则在点击yellowVC后就无法回到BlueVC。

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

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

在BlueVC中执行以下操作:

override func viewDidLoad() {
        super.viewDidLoad()

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

它将显示BlueVC秒。

如果要直接从RedVC迁移YellowVC (跳过BlueVC ),将排除BlueVC初始化的可能性。 因此,当您从YellowVC执行向后导航时,必须强制初始化BlueVC以实现所需的功能。
尽管不建议这样做,因为它不会遵循默认的VC生命周期。 但是,如果要这样做,则需要明确照顾其行为。 例如-持久化数据。

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

取消选中属性检查器中的“动画”复选框。

在此处输入图片说明

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

另一个解决方案是以编程方式做到这一点而不会引起争执。 为您的蓝色和黄色VC提供一些标识符:

在此处输入图片说明

要变为黄色,请实例化您的蓝色和黄色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)

是的,您可以在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中,您需要包装该对象并将其放在那里。 希望有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM