我有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
我想,如果我从RedVC转到YellowVC,我希望YellowVC中的后退按钮将我引导到BlueVC,而不是RedVC。
如何实现这一目标?
答案 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"属性检查器中的复选框。
要转到黄色,请先执行此segue并传递一个true
标志,指示我们是否将黄色变为蓝色。蓝色,处理此标志。如果该标志为true,则将动画segue设置为黄色。如果我们只是蓝色,将执行动画segue为蓝色,标志将为false
。
另一个解决方案是以编程方式执行此操作而不使用segues。给你的蓝色和黄色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)
答案 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你需要创建该对象并放在那里。希望这有帮助!