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