如何“流行”导航控制器和所有其视图控制器

问题描述 投票:0回答:2

我已经在现有的应用程序,我试图解决干净继承导航控制器的问题。

这个程序有多个故事板和多个UINavigationControllers。在应用中的一个点,一系列视图控制器的有模式中,采用一个单独的故事板和一个单独的导航控制器。当模态过程完成后,导航层次结构看起来是这样的:

NavController1 - > VC1 [ '当前模态' 赛格瑞] - > NavController2 - > VC2 - > VC3 - > VC4

当用户完成在VC4模态活动,解除()被编程呼吁VC4,然后用户可以使用后退按钮导航回到VC1。

但是,我们真正需要做的是“爆开”所有的模态呈现设置视图控制器(和它们的导航控制器)的当用户完成模式活动。问题是,从VC3或VC4我不能叫popToRootViewController()。我也无法穿越下来VC堆找到VC1,因为目前的导航控制器不对其进行管理。

一对夫妇的解决方案浮现在脑海中:

1)使用通知管理器,并有弹出一切关闭消息VC1听回自己

2)通过作为代表一路链条VC1的引用,以便VC3或4可以具有它弹出一切断

这两种解决方案遵循的演示VC应该是驳回一个一般的格言,但无论是什么,我会考虑干净。

我欢迎任何想法或替代解决方案。

ios swift uiviewcontroller uinavigationcontroller
2个回答
0
投票

假定这些是视图控制器被布置方式:

NavController1 - [ '根视图控制器' 赛格瑞] - > VC1 - [ '当前模态' SEGUE] -

- > NavController2 - [ '根视图控制器' 如下] - > VC2 - [ '推送' 如下] - > VC3 - [ '推送' 如下] - > VC4

您应该能够通过解雇或者VC2,VC3或VC4回去VC1。

// example for vc4
vc4.navigationController?.dismiss(animated: true, completion: nil)

但是,如果每个viewControllers进行了模态呈现,你应该能够通过presentingViewController遍历到达VC1。

var currentVC: UIViewController? = self
var presentingVC: UIViewController? = currentVC?.presentingViewController
while presentingVC != nil && !(presentingVC is VC1) {
    currentVC?.dismiss(animated: true, completion: nil)
    currentVC = presentingVC
    presentingVC = currentVC?.presentingViewController
}

希望帮助。


0
投票

弹出时,您可以从您的导航控制器踢出viewControllers,将解决你的问题

extension UINavigationController { 
     public func removeViewController(classes : [String]) {
           var vcs = [UIViewControllers]()
           for viewController in self.viewControllers {
               let name = viewController.className
               if !classes.contains(name) {
                    vcs.append(viewController)
                }
           }
           if classes.count < vcs.count {
               self.viewControllers = vcs
           }
    }
}

现在认为你有4个viewControllers,A,B,C,d,要删除B和C和回迁

在D的视图控制器

override func viewDidLoad() {
   super.viewDidLoad()
   //your works
   let viewControllersToRemove = [String(describing: type(of:B)), String(describing: type(of:C))]
   navigationController.removeViewControoler(classes : viewControllersToRemove)
}
© www.soinside.com 2019 - 2024. All rights reserved.