ios - Swift - 关闭然后弹出 VC
问题描述
我将如何解除模态视图控制器及其被推送的父级?
self.presentingViewController?.dismiss(animated: true, completion: {
self.parent?.navigationController?.popViewController(animated: true)
})
这只会忽略顶部模式。
解决方案
你可以走另一条路。首先,您UINavigationController
在主视图中。因此,您可以编写一个扩展程序,允许您转到导航堆栈中的控制器。
我试着做一个这样的实现:
extension UINavigationController {
func routingPath(for controller: UIViewController) -> [UIViewController] {
guard viewControllers.contains(controller) else {
return []
}
var result: [UIViewController] = []
for previousController in viewControllers {
result.append(previousController)
if controller === previousController {
break
}
}
return result
}
func performNavigation(toPrevious controller: UIViewController,
shouldDismissModals: Bool = true) {
let previousViewControllers = routingPath(for: controller)
guard !previousViewControllers.isEmpty else { return }
viewControllers = previousViewControllers
if shouldDismissModals, let _ = controller.presentedViewController {
controller.dismiss(animated: true, completion: nil)
}
}
}
然后你可以为UIViewController
:
extension UIViewController {
func returnBackIfPossible(to controller: UIViewController? = nil,
shouldDismissModals: Bool = true) {
navigationController?.performNavigation(toPrevious: controller ?? self,
shouldDismissModals: shouldDismissModals)
}
}
然后,您需要将 Home 控制器的引用传递给所有下一个控制器(或将其存储在某处)。接下来,当需要时,您可以调用homeViewController?.returnBackIfPossible()
方法,该方法将关闭所有模式并重置导航堆栈。
推荐阅读
- c# - Azure 函数读取 local.settings.json 到对象
- ruby-on-rails - 每当 gem 错误 - 找不到命令“bin/rails”
- javascript - 模拟按键事件按下,强制按住向下箭头?
- python - Raspberry Pi 线程 RFID 上的 PyQt5 Python
- python - 模拟 timedelta.total_seconds()
- excel - 过滤时剪切和粘贴范围不起作用
- c - GNU make 不包含头文件
- javascript - 某些文件的进度条不加载(javascript)
- json - Web api 调用返回带有空字段的 json 数据
- bash - Bash中For循环的空白输出