在模态瞄准中解雇视图控制器

时间:2017-04-12 15:36:10

标签: ios swift uiviewcontroller segue

我正在创建一个使用ViewController1打开的应用程序,然后一个按钮打开另一个带有模态segue的视图控件(ViewController2)。然后ViewController2有一个按钮,使用另一个模态segue打开另一个视图控制器(ViewController3)。 2和3视图控制器都有一个解除按钮,可以解除视图控制器。

问题在于,每当ViewController3使用dismiss按钮时,当我想要它解除ViewController1时,它会解散为ViewController 2。我已经尝试使用解除操作来解除ViewController2按下按钮,但是segue没有被提交。

这可能令人困惑,如果您需要帮助,请提出问题。非常感谢你!

(我使用的是Swift 3和Xcode 8)

3 个答案:

答案 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);
    });
}

请记住,稍后在代码中不需要观察者时将其删除;)