从模态弹出到根视图控制器

时间:2016-10-03 11:53:19

标签: ios swift swift3

我正在尝试使用以下代码弹出到根视图控制器:

self.navigationController!.popToRootViewController(animated: true)

这通常有效,但在当前视图是模态时尝试使用此代码时出错。在这种情况下,如何弹回到根视图控制器?

提前致谢。

6 个答案:

答案 0 :(得分:21)

您可以检查当前控制器是否已显示,如果已显示,则将其关闭,然后转到rootViewController,直接转到rootViewController

if self.presentingViewController != nil {
    self.dismiss(animated: false, completion: { 
       self.navigationController!.popToRootViewController(animated: true)
    })
}
else {
    self.navigationController!.popToRootViewController(animated: true)
}

答案 1 :(得分:8)

结果:

代码

假设您的模态视图与以下ViewController关联。

首先要隐藏显示为模态的视图,您可以使用ViewController实例中的dismiss(animated: Bool)方法。

对于以 Pushed 呈现的视图,您可以在navigationController属性中使用这些方法,例如:popToRootViewController(animated: Bool)popViewController(animated:Bool)

class ModalViewController: UIViewController {

  @IBAction func backButtonTouched(_ sender: AnyObject) {
    let navigationController = self.presentingViewController as? UINavigationController

    self.dismiss(animated: true) {
      let _ = navigationController?.popToRootViewController(animated: true)
    }
  }

}

答案 2 :(得分:4)

您已经展示了一个ViewController,因此您需要将其解除。

要在swift中关闭ViewController,请使用:

self.dismiss(animated: true, completion: nil)

答案 3 :(得分:0)

您可以这样做:

<强> 目标C:

[(UINavigationController *)self.presentingViewController popToRootViewControllerAnimated:NO];

[self dismissViewControllerAnimated:YES completion:nil];

请在此处查看答案以供参考:

ios: how to dismiss a modal view controller and then pop a pushed view controller

答案 4 :(得分:0)

如何使用通知?

你的模态只发布通知

然后您的NavigationController接收,弹出到rootViewController

答案 5 :(得分:0)

如果您不希望动画发生,即希望用户在关闭模态视图后看到根视图控制器:

CATransaction.begin()
CATransaction.setCompletionBlock {
    self.dismiss(animated: true, completion: nil)
}
self.navigationController?.popViewController(animated: false)
CATransaction.commit()

引用自:Completion block for popViewController

以上内容适用于弹出单个视图控制器。如果您需要弹出多个,popToRootViewController将不起作用(由于动画而导致通话不平衡)。

在这种情况下,请使用以下(手动)方法将其删除:

guard let navigationController = self.navigationController else { return }
var navigationViewControllers = navigationController.viewControllers
navigationViewControllers.removeLast(navigationViewControllers.count - 1)
self.navigationController?.viewControllers = navigationViewControllers