有没有办法在 Swift 中同时关闭两个 uiViewController?

is there a way of dismissing two uiViewControllers at the same time in Swift?

在我的 swift 应用程序中,我有一个带按钮的 UIViewController。此按钮打开 UIViewController 编号 2,用户有另一个按钮。当用户按下它时 - 他打开 UIViewController 3 号。还有一个按钮,当用户按下它时 - 他调用代码:

self.dismissViewControllerAnimated(false, completion: nil)

多亏了它,3 号 UIViewController 消失了,用户看到了 2 号 UIViewController。我的问题是 - 是否有一种方法也可以关闭 2 号 UIViewController,以便用户可以顺利地从 3 号返回到 1 号?

现在我创建了一个函数并通过协议调用它:

UIViewController 编号 2:

protocol HandleYourFullRequest: class {
    func hideContainer()
}


class FullRequest: UIViewController, HandleYourFullRequest{

    func hideContainer(){
       self.dismissViewControllerAnimated(false, completion: nil)
    }

    @IBAction func exitbuttonaction(sender: AnyObject) {
        self.performSegueWithIdentifier("temporarySegue", sender: self)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "temporarySegue"){


        if let fullRequestDetails = segue.destinationViewController as? YourFullRequest
        {

            fullRequestDetails.delegateRequest = self
        }

    }
    }



}

UIViewController 编号 3:

class YourFullRequest: UIViewController{

    var delegateRequest:HandleYourFullRequest?

    @IBAction func exitbuttonaction(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: nil)

        delegateRequest?.hideContainer()
    }
}

但是当用户按下按钮时使用该解决方案 - 3 号 UIViewController 消失,2 号 UIViewController 出现一秒钟然后消失。有没有办法在不向用户显示的情况下删除数字 2 并直接将他指向数字 1?

您可以使用popToViewController(viewController: UIViewController, animated: Bool)

其中 viewController 是您希望弹出的 viewController,在您的情况下,'UIViewController number 1'。

popToViewController Documentation

如果您没有对视图控制器的引用,您可以从 self.navigationController.viewControllers 获取它,它将是您示例中的第一个对象。

UINavigationController 上有一个名为 setViewControllers 的方法。它需要你想要激活的所有视图控制器的数组。您可以将堆栈上的所有视图控制器作为数组获取,删除不需要的视图控制器,然后使用更新后的数组调用 setViewControllers。

您可以使用 removeLast() 函数将控制器从堆栈中弹出。

@IBAction func doneAction(sender: AnyObject) {
    var vc = self.navigationController?.viewControllers
    // remove controllers from the stack
    vc?.removeLast()
    vc?.removeLast()
    // Jump back to the controller you want.
    self.navigationController?.setViewControllers(vc!, animated: false)        
}

我仍然不清楚哪个按钮连接到哪个操作,但据我所知,当在视图控制器 3 上按下关闭按钮时,它会在视图控制器编号 2 中调用 self.dismissViewControllerAnimated(false, completion: nil)

尝试将此方法放在视图控制器 3 中。

@IBAction func exitButtonAction(sender: AnyObject) {
    self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil);
}

这将在假设两个视图控制器都被呈现并且没有被推送到导航控制器之类的东西中的情况下工作。