首页 文章

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

提问于
浏览
1

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

问题是,每当ViewController3使用dismiss按钮时,当我希望它解除ViewController1时,它会关闭ViewController 2 . 我已经尝试使用dismiss动作来解除按下按钮的ViewController2,但是segue没有被提交 .

这可能会令人困惑,所以如果您需要帮助理解,请提出问题 . 非常感谢!

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

3 回答

  • 0

    我最喜欢的两个选项:1 . 使用NotificationCenter并发送ViewController2正在侦听的解雇通知2.在ViewController3上设置parentViewController引用,然后在解除自身后调用父节点上的dismiss .

  • 0

    发生这种情况是因为所有3个视图控制器都在堆栈中,每当你关闭顶部的视图控制器时它移动到它下面的视图控制器 . 要导航到viewcontroller1,请使用: -

    if let viewcontroller1 = navigationController?.viewControllers[0]{
        _ = navigationController?.popToViewController(viewcontroller1, animated: true)
    
            }
    
  • 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);
        });
    }
    

    记得稍后在代码中不需要它们时删除观察者;)

相关问题