从模态弹出到根视图控制器
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
【讨论】:
以上是关于从模态弹出到根视图控制器的主要内容,如果未能解决你的问题,请参考以下文章