Pop 2 view controllers in Nav Controller in Swift

后端 未结 8 992
星月不相逢
星月不相逢 2021-01-30 12:46

I have found many ways to pop back 2 UIViewControllers in UINavigationController using Objective-C, however when I try and switch that over to Swift it

相关标签:
8条回答
  • 2021-01-30 13:22

    I wrote an UIViewController extension (Swift 3+ ready)

    You could use like this :

    /// pop back n viewcontroller
    func popBack(_ nb: Int) {
        if let viewControllers: [UIViewController] = self.navigationController?.viewControllers {
            guard viewControllers.count < nb else {
                self.navigationController?.popToViewController(viewControllers[viewControllers.count - nb], animated: true)
                return
            }
        }
    }
    

    Usage :

    self.popBack(3)
    

    Bonus dismiss to a specific viewcontroller

    /// pop back to specific viewcontroller
    func popBack<T: UIViewController>(toControllerType: T.Type) {
        if var viewControllers: [UIViewController] = self.navigationController?.viewControllers {
            viewControllers = viewControllers.reversed()
            for currentViewController in viewControllers {
                if currentViewController .isKind(of: toControllerType) {
                    self.navigationController?.popToViewController(currentViewController, animated: true)
                    break
                }
            }
        }
    }
    

    Usage :

    self.popBack(toControllerType: MyViewController.self)
    
    0 讨论(0)
  • 2021-01-30 13:32

    I did a helper to make it easy:

    import Foundation
    import UIKit
    
    class NavigationHelper {
    
        static func back(number: Int, from viewControlller : UIViewController) {
            let viewsBack = number + 1
            let viewControllers: [UIViewController] = viewControlller.navigationController!.viewControllers as [UIViewController]
            viewControlller.navigationController!.popToViewController(viewControllers[viewControllers.count - viewsBack], animated: true)
        }
    
        static func back(number: Int, from viewControlller: UITableViewController) {
            let viewsBack = number + 1
            let viewControllers: [UIViewController] = viewControlller.navigationController!.viewControllers as [UIViewController]
            viewControlller.navigationController!.popToViewController(viewControllers[viewControllers.count - viewsBack], animated: true)
        }
    }
    

    For example, in your ViewController you can use NavigationHelper.back(number: 1, from: self)

    0 讨论(0)
  • 2021-01-30 13:33

    Expanding on my comment, find the second last view controller in the viewControllers array and then use popToViewController to avoid overwriting the entire view controller stack.

    Example (assumes the navigation controller has more than 1 view controller):

    func backTwo() {
        let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]
        self.navigationController!.popToViewController(viewControllers[viewControllers.count - 3], animated: true)
    }
    

    Objective-C

    NSArray *viewControllers = [self.navigationController viewControllers];
    [self.navigationController popToViewController:viewControllers[viewControllers.count - 3] animated:YES];
    
    0 讨论(0)
  • 2021-01-30 13:39

    user5320485 answer in swift3

    let viewControllers = self.navigationController!.viewControllers as [UIViewController];
    for aViewController:UIViewController in viewControllers {
        if aViewController.isKind(of: AdCreateViewController.self) {
            _ = self.navigationController?.popToViewController(aViewController, animated: true)
        }
    }
    
    0 讨论(0)
  • 2021-01-30 13:42

    You can dynamically pop multiple viewcontrollers in (swift 2.0)

    let allViewController: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];
    
                            for aviewcontroller : UIViewController in allViewController
                            {
                                if aviewcontroller .isKindOfClass(YourDestinationViewControllerName)
                                {
                                 self.navigationController?.popToViewController(aviewcontroller, animated: true)
                                }
                            }
    
    0 讨论(0)
  • 2021-01-30 13:43

    Swift 4 UINavigationController extension version of @Maximelc's answer:

    extension UINavigationController {
    
        func popBack(_ nb: Int) {
            let viewControllers: [UIViewController] = self.viewControllers
            guard viewControllers.count < nb else {
                self.popToViewController(viewControllers[viewControllers.count - nb], animated: true)
                return
            }
        }
    
        /// pop back to specific viewcontroller
        func popBack<T: UIViewController>(toControllerType: T.Type) {
            var viewControllers: [UIViewController] = self.viewControllers
            viewControllers = viewControllers.reversed()
            for currentViewController in viewControllers {
                if currentViewController .isKind(of: toControllerType) {
                    self.popToViewController(currentViewController, animated: true)
                    break
                }
            }
        }
    
     }
    
    0 讨论(0)
提交回复
热议问题