在Swift中的Nav Controller中弹出2个视图控制器

can*_*Man 38 uinavigationcontroller ios

我已经找到了许多使用Objective-C 回弹2 UIViewControllersUINavigationController方法,但是当我尝试将其切换到Swift时它似乎没有用.

回弹的最佳方法是UIViewController什么?任何指导将不胜感激谢谢

Aar*_*ski 123

扩展我的注释,在viewControllers数组中找到第二个最后一个视图控制器,然后使用popToViewController来避免覆盖整个视图控制器堆栈.

示例(假设导航控制器具有多个视图控制器):

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

  • 哇,谢谢Aaron,这完美无缺!奇怪的是,我不得不把`viewControllers.count - 3`弹回两步,但现在工作得非常好! (6认同)

Max*_*elc 19

我写了一个UIViewController扩展(Swift 3+准备好了)

你可以像这样使用:

/// 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

self.popBack(3)
Run Code Online (Sandbox Code Playgroud)

奖金解雇特定的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
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

self.popBack(toControllerType: MyViewController.self)
Run Code Online (Sandbox Code Playgroud)


小智 11

您可以在(swift 2.0)中动态弹出多个viewcontrollers

let allViewController: [UIViewController] = self.navigationController!.viewControllers as [UIViewController];

                        for aviewcontroller : UIViewController in allViewController
                        {
                            if aviewcontroller .isKindOfClass(YourDestinationViewControllerName)
                            {
                             self.navigationController?.popToViewController(aviewcontroller, animated: true)
                            }
                        }
Run Code Online (Sandbox Code Playgroud)


nid*_*hin 11

user5320485在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)
    }
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*ess 7

@Maximelc 答案的 Swift 4 UINavigationController 扩展版本:

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

 }
Run Code Online (Sandbox Code Playgroud)

  • 用法: `self.navigationController?.popBack(1) self.navigationController?.popBack(toControllerType: YourViewController.self)` (2认同)