12

如何在 Swift iOS 中关闭 2 个视图控制器?

下面是我的代码。

@IBAction func backButtonTapped(sender: AnyObject) {
    self.presentingViewController
        .presentingViewController
        .dismissViewControllerAnimated(true, completion: nil)
}
4

4 回答 4

16

斯威夫特 3+ 版本。您可以使用以下代码在 Swift 3 中一次关闭两个视图控制器。

func dismissTwoViews() {
    self.presentingViewController?
        .presentingViewController?.dismiss(animated: true, completion: nil)
}

斯威夫特 4+ 版本。只是我们需要弹出特定的视图控制器使用这个扩展

extension UINavigationController {

func popToViewController(ofClass: AnyClass, animated: Bool = true) {
    if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
        popToViewController(vc, animated: animated)
    }
}

func popViewControllers(viewsToPop: Int, animated: Bool = true) {
    if viewControllers.count > viewsToPop {
        let vc = viewControllers[viewControllers.count - viewsToPop - 1]
        popToViewController(vc, animated: animated)
    }
}

}

并在您的视图控制器类中像这样使用

for controller in self.navigationController!.viewControllers as 
    Array {
                  if controller.isKind(of: 
    yourPopControllerName.self) {

   self.navigationController?.isNavigationBarHidden = false
                                _ =  
self.navigationController!.popToViewController(controller, 
 animated: false)
                                    break
                                }
                            }
于 2017-03-26T09:17:32.480 回答
14

为此目的,有一个特殊的unwind segue,它旨在回滚到堆栈中的某个视图控制器。

让我们将最顶层的控制器(您从哪里来)称为source,并将堆栈中的控制器(您想要回滚到顶部)称为destination

  1. IBAction目标位置创建以在展开 segue 时触发:

    @IBAction func myUnwindAction(segue: UIStoryboardSegue) {}

它可以是空的。

  1. 控制器中,通过从控制器图标拖动退出一个来创建一个展开 segue,它将找到您在步骤 1 中创建的动作。调用 segue unwind

  2. 现在你可以用常规的代码从代码中发出那个segue

    performSegueWithIdentifier("unwind", sender: nil)

我描述了如何从代码中发出 unwind segue。对于按钮展开 segues 可以通过拖动按钮退出图标直接在 IB 中创建。

另请查看此讨论以获取更多信息:如何以编程方式执行 Unwind segue?

于 2015-09-16T10:05:25.463 回答
2

您一次只能关闭一个视图控制器。尝试这个

@IBAction func backButtonTapped(sender: AnyObject) {
        self.presentingViewController?.dismissViewControllerAnimated(true, completion: {
            let secondPresentingVC = self.presentingViewController?.presentingViewController;
            secondPresentingVC?.dismissViewControllerAnimated(true, completion: {});
        });
}
于 2015-01-14T13:32:57.573 回答
0

斯威夫特 4:

为 UIViewController 创建了一个扩展,可以根据提供的次数在 NavigationController 堆栈中弹出 UIViewController

extension UIViewController {

    func pop(numberOfTimes: Int) {
        guard let navigationController = navigationController else {
            return
        }
        let viewControllers = navigationController.viewControllers
        let index = numberOfTimes + 1
        if viewControllers.count >= index {
            navigationController.popToViewController(viewControllers[viewControllers.count - index], animated: true)
        }
    }
}
于 2018-09-19T04:25:31.660 回答