首页 > 解决方案 > Swift - 关闭然后弹出 VC

问题描述

我将如何解除模态视图控制器及其被推送的父级?

self.presentingViewController?.dismiss(animated: true, completion: {
     self.parent?.navigationController?.popViewController(animated: true)
})

这只会忽略顶部模式。

标签: iosswift

解决方案


你可以走另一条路。首先,您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()方法,该方法将关闭所有模式并重置导航堆栈。


推荐阅读