我已经在现有的应用程序,我试图解决干净继承导航控制器的问题。
这个程序有多个故事板和多个UINavigationControllers。在应用中的一个点,一系列视图控制器的有模式中,采用一个单独的故事板和一个单独的导航控制器。当模态过程完成后,导航层次结构看起来是这样的:
NavController1 - > VC1 [ '当前模态' 赛格瑞] - > NavController2 - > VC2 - > VC3 - > VC4
当用户完成在VC4模态活动,解除()被编程呼吁VC4,然后用户可以使用后退按钮导航回到VC1。
但是,我们真正需要做的是“爆开”所有的模态呈现设置视图控制器(和它们的导航控制器)的当用户完成模式活动。问题是,从VC3或VC4我不能叫popToRootViewController()。我也无法穿越下来VC堆找到VC1,因为目前的导航控制器不对其进行管理。
一对夫妇的解决方案浮现在脑海中:
1)使用通知管理器,并有弹出一切关闭消息VC1听回自己
2)通过作为代表一路链条VC1的引用,以便VC3或4可以具有它弹出一切断
这两种解决方案遵循的演示VC应该是驳回一个一般的格言,但无论是什么,我会考虑干净。
我欢迎任何想法或替代解决方案。
假定这些是视图控制器被布置方式:
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
}
希望帮助。
弹出时,您可以从您的导航控制器踢出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)
}