Ios 在Modally Segue中解除视图控制器

Ios 在Modally Segue中解除视图控制器,ios,swift,uiviewcontroller,segue,Ios,Swift,Uiviewcontroller,Segue,我正在创建一个用ViewController1打开的应用程序,然后一个按钮打开另一个带有modally segue的视图控制器(ViewController2)。然后ViewController2有一个按钮,可以使用另一个modally segue打开另一个视图控制器(ViewController3)。2和3视图控制器都有一个解除按钮,用于解除视图控制器 问题在于,每当ViewController3使用“解除”按钮时,当我希望它解除到ViewController1时,它就会解除到ViewCont

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

问题在于,每当ViewController3使用“解除”按钮时,当我希望它解除到ViewController1时,它就会解除到ViewController2。我曾尝试在按下按钮时使用Disclease操作来关闭ViewController2,但随后segue无法提交

这可能会令人困惑,因此如果您需要帮助理解,请提出问题。非常感谢


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

之所以会出现这种情况,是因为所有3个viewcontroller都在堆栈中,每当您关闭顶部的viewcontroller时,它都会移动到它下面的一个。 要导航到viewcontroller1,请使用:-

 if let viewcontroller1 = navigationController?.viewControllers[0]{
    _ = navigationController?.popToViewController(viewcontroller1, animated: true)

        }

之所以会出现这种情况,是因为所有3个viewcontroller都在堆栈中,每当您关闭顶部的viewcontroller时,它都会移动到其下方的viewcontroller。 要导航到viewcontroller1,请使用:-

 if let viewcontroller1 = navigationController?.viewControllers[0]{
    _ = navigationController?.popToViewController(viewcontroller1, animated: true)

        }

我有两个选择: 1.使用NotificationCenter并发送ViewController2正在侦听的解除通知
2.在ViewController3上设置parentViewController引用,然后在解除其自身后调用parentViewController上的Dismise。

我脑子里有两个选项: 1.使用NotificationCenter并发送ViewController2正在侦听的解除通知 2.在ViewController3上设置parentViewController引用,然后在解除其自身后在父级上调用Dismise。

这很简单

        //*** 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);
    });
}
当代码中不需要观察员时,请记住稍后删除观察员;)

很简单

        //*** 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);
    });
}

当代码中不需要观察员时,请记住稍后删除观察员;)

如果我的理解是正确的,当您点击viewcontroller3上的Disclose按钮时,您希望返回viewcontroller1而不是viewcontroller2。是吗?@iOSFreak是的如果我的理解是正确的,当你点击viewcontroller3上的Disclose按钮时,你想回到viewcontroller1而不是viewcontroller2。是吗?@iOSFreak是的,谢谢你的帮助。代码如下所示:self.navigationController?.popToViewController(ViewController1,动画:true)。但是我收到一个错误“预期参数类型‘UIViewController’”@IfunnyLogger我已经编辑了答案,请看一看谢谢您的帮助。代码如下所示:self.navigationController?.popToViewController(ViewController1,动画:true)。但是我得到一个错误“预期参数类型‘UIViewController’”@IfunnyLogger我已经编辑了答案,看一看嘿!谢谢你的回答!我对斯威夫特有点陌生,而且我还在学习,所以你能引导我完成其中一项吗?如果你不能,我完全明白!但是,无论如何,谢谢!嘿谢谢你的回答!我对斯威夫特有点陌生,而且我还在学习,所以你能引导我完成其中一项吗?如果你不能,我完全明白!但是,无论如何,谢谢!