从导航栈中移除视图控制器

115

我有一个导航栈,包含5个UIViewController。我希望在第5个UIViewController上的按钮点击事件中移除栈中的第3个和第4个视图控制器。是否可能?如果是,如何实现?

16个回答

3

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()方法之后调用此实用程序函数。


2

这个解决方案在Swift 4中对我有效:

let VCCount = self.navigationController!.viewControllers.count
self.navigationController?.viewControllers.removeSubrange(Range(VCCount-3..<VCCount - 1))

您当前在堆栈中的视图控制器索引为:

self.navigationController!.viewControllers.count - 1

1

Swift 5.4

移除SpecificViewController

navigationController.viewControllers.removeAll { $0 is SpecificViewController }

0

你应该从导航控制器数组中删除控制器,以及它们的父控制器

 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
        }
    })

0

// 从堆栈中按类名移除视图控制器,然后关闭当前视图。

 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)

0

我编写了一个扩展方法,它可以删除根和顶部之间的所有控制器,除非另有指定。

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上进行测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接