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

Posted

技术标签:

【中文标题】从模态弹出到根视图控制器【英文标题】:Pop to root view controller from modal 【发布时间】:2016-10-03 11:53:18 【问题描述】:

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

self.navigationController!.popToRootViewController(animated: true)

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

提前致谢。

【问题讨论】:

您遇到了哪个错误? 【参考方案1】:

您可以检查当前控制器是否存在,如果存在则关闭它并转到rootViewController,否则直接转到rootViewController

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

else 
    self.navigationController!.popToRootViewController(animated: true)

【讨论】:

看起来完成处理程序中的self.navigationController!.popToRootViewController(animated: true) 可能不正确?你不应该使用presentingViewController 的导航控制器来弹出到根目录吗?【参考方案2】:

结果:

代码

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

首先要隐藏显示为 Modal 的 View,您可以使用 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)
    
  
  

【讨论】:

【参考方案3】:

你已经提交了一个 ViewController,所以你需要关闭它。

要快速关闭 ViewController,请使用:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

使用通知怎么样?

你的模态只是发布通知

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

【讨论】:

【参考方案6】:

你可以这样做:

目标-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

【讨论】:

以上是关于从模态弹出到根视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

从 Popover 关闭或弹出到根视图控制器

如何关闭视图控制器并快速弹出到根视图控制器?

从模态视图控制器推送/弹出到另一个视图控制器(包括图片)

检测 - 弹出到根 VC 后,VIewctrollers 未从内存中删除

弹出到根视图控制器时导航栏消失

弹出到根视图控制器,没有表视图的动画崩溃