swift-为了兼容侧滑返回,移除导航控制器中指定的(单个、多个连续|不连续)控制器可行性实践

最近项目一直在忙,整理的笔记都在个人的印象笔记中,没怎么分享,后期会每个周末写几篇分享出来自己在项目中的一些小经验;
在由导航控制器维护的控制器中,有的时候,为了满足项目的需求,会实现越级侧滑返回的功能,甚至需要侧滑返回的上一级控制器是原来的间隔多个的控制器。这个时候,为了同时满足侧滑返回和点击导航栏上的(自定义)返回按钮返回至相同控制器的需求,就需要从导航控制器维护的数组(栈,注意,导航控制器运用了栈的概念)中,移除指定的控制器。话不多说,直接上代码:

 /// 移除导航控制器中指定的(单个、多个连续|不连续)控制器
private func removeChildControllers() {
    
    // 移除导航控制器中指定的多个连续控制器,方法一:
    if let tmpControllers = navigationController?.viewControllers {
        var controllers = tmpControllers
        // 从导航控制器的堆栈中连续移除多个维护的控制器,推荐用这种方法,注意数组越界的问题,因此从最大的开始遍历,逐级往最小的移除
        for i in (1 ..< (controllers.count-1)).reversed() {
            controllers.remove(at: i)
            navigationController?.viewControllers = controllers
        }
    }
    
    // 移除导航控制器中指定的多个连续控制器,方法二:
//        guard let tmpControllers = navigationController?.viewControllers else { return }
//        var controllers = tmpControllers
//        
//        // 从导航控制器的堆栈中连续移除多个维护的控制器,推荐用这种方法,注意数组越界的问题,因此从最大的开始遍历,逐级往最小的移除
//        for i in (1 ..< (controllers.count-1)).reversed() {
//            controllers.remove(at: i)
//            navigationController?.viewControllers = controllers
//        }
    
    
//        // 移除导航控制器中指定的多个不连续控制器,推荐用这种方法
//        for (i, controller) in (controllers.enumerated()).reversed() {
//            if controller.isKind(of: ViewController4.classForCoder()) {
//                controllers.remove(at: i)
//                navigationController?.viewControllers = controllers
//            }
////            if controller.isKind(of: ViewController3.classForCoder()) {
////                controllers.remove(at: i)
////                navigationController?.viewControllers = controllers
////            }
////            if controller.isKind(of: ViewController2.classForCoder()) {
////                controllers.remove(at: i)
////                navigationController?.viewControllers = controllers
////            }
//            if controller.isKind(of: ViewController1.classForCoder()) {
//                controllers.remove(at: i)
//                navigationController?.viewControllers = controllers
//            }
//        }
}

Demo链接:https://github.com/qtds8810/06_NavigationControllers
个人QQ号:1961156518,有什么问题直接联系哈,不吝赐教。

你可能感兴趣的:(swift-为了兼容侧滑返回,移除导航控制器中指定的(单个、多个连续|不连续)控制器可行性实践)