我有一个导航栈,包含5个UIViewController。我希望在第5个UIViewController上的按钮点击事件中移除栈中的第3个和第4个视图控制器。是否可能?如果是,如何实现?
我有一个导航栈,包含5个UIViewController。我希望在第5个UIViewController上的按钮点击事件中移除栈中的第3个和第4个视图控制器。是否可能?如果是,如何实现?
Swift 5.1, Xcode 11
extension UINavigationController{
public func removePreviousController(total: Int){
let totalViewControllers = self.viewControllers.count
self.viewControllers.removeSubrange(totalViewControllers-total..<totalViewControllers - 1)
}}
确保在前一个控制器的viewDidDisappear()方法或新控制器的viewDidAppear()方法之后调用此实用程序函数。
这个解决方案在Swift 4中对我有效:
let VCCount = self.navigationController!.viewControllers.count
self.navigationController?.viewControllers.removeSubrange(Range(VCCount-3..<VCCount - 1))
您当前在堆栈中的视图控制器索引为:
self.navigationController!.viewControllers.count - 1
Swift 5.4
移除SpecificViewController
navigationController.viewControllers.removeAll { $0 is SpecificViewController }
你应该从导航控制器数组中删除控制器,以及它们的父控制器
navigationController?.viewControllers.removeAll(where: { (vc) -> Bool in
if vc.isKind(of: MyViewController.self)
|| vc.isKind(of: MyViewControllerType2.self)
|| vc.isKind(of: MyViewControllerType3.self) {
/* remove from parent */
vc.removeFromParent()
return true
} else {
return false
}
})
// 从堆栈中按类名移除视图控制器,然后关闭当前视图。
self.navigationController?.viewControllers.removeAll(where: { (vc) -> Bool in
if vc.isKind(of: ViewController.self) || vc.isKind(of: ViewController2.self)
{
return true
}
else
{
return false
}
})
self.navigationController?.popViewController(animated: false)
self.dismiss(animated: true, completion: nil)
我编写了一个扩展方法,它可以删除根和顶部之间的所有控制器,除非另有指定。
extension UINavigationController {
func removeControllers(between start: UIViewController?, end: UIViewController?) {
guard viewControllers.count > 1 else { return }
let startIndex: Int
if let start = start {
guard let index = viewControllers.index(of: start) else {
return
}
startIndex = index
} else {
startIndex = 0
}
let endIndex: Int
if let end = end {
guard let index = viewControllers.index(of: end) else {
return
}
endIndex = index
} else {
endIndex = viewControllers.count - 1
}
let range = startIndex + 1 ..< endIndex
viewControllers.removeSubrange(range)
}
}
如果你想使用范围(例如:2到5),你可以直接使用。 let range = 2 ..< 5
viewControllers.removeSubrange(range)
已在iOS 12.2、Swift 5上进行测试