我正在创建一个使用ViewController1打开的应用程序,然后一个按钮打开另一个带有模态segue的视图控件(ViewController2)。然后ViewController2有一个按钮,使用另一个模态segue打开另一个视图控制器(ViewController3)。 2和3视图控制器都有一个解除按钮,可以解除视图控制器。
问题在于,每当ViewController3使用dismiss按钮时,当我想要它解除ViewController1时,它会解散为ViewController 2。我已经尝试使用解除操作来解除ViewController2按下按钮,但是segue没有被提交。
这可能令人困惑,如果您需要帮助,请提出问题。非常感谢你!
(我使用的是Swift 3和Xcode 8)
答案 0 :(得分:0)
这是因为所有3个viewcontroller都在堆栈中,每当你解除顶部的viewcontroller它会移动到它下面的那个。 要导航到viewcontroller1,请使用: -
if let viewcontroller1 = navigationController?.viewControllers[0]{
_ = navigationController?.popToViewController(viewcontroller1, animated: true)
}
答案 1 :(得分:0)
我头顶的两个选项: 1.使用NotificationCenter并发送ViewController2正在侦听的关闭通知 2.在ViewController3上设置parentViewController引用,然后在解除自身后调用父对象的dismiss。
答案 2 :(得分:0)
//*** in ViewController2
NotificationCenter.default.addObserver(self, selector: #selector(ViewController.onCloseViewController2), name: NSNotification.Name(rawValue: "closeViewController2"), object: nil)
func onCloseViewController2() {
//this function is called from notification (sent by vc3)
self.navigationController?.dismiss(animated: true, completion: nil);
}
@IBAction func closeView2FromButton() {
//Directly close modal
self.onCloseViewController2();
}
//*** in ViewController3 (tap button)
@IBAction func closeView3FromButton() {
//dismiss vc3 and send a notification to vc2
self.navigationController?.dismiss(animated: true, completion: {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "closeViewController2"), object: nil);
});
}
请记住,稍后在代码中不需要观察者时将其删除;)