ios 在 Swift 中的导航控制器中弹出 2 个视图控制器

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26132658/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 02:56:27  来源:igfitidea点击:

Pop 2 view controllers in Nav Controller in Swift

iosuinavigationcontroller

提问by candidaMan

I have found many ways to pop back 2 UIViewControllersin UINavigationControllerusing Objective-C, however when I try and switch that over to Swift it doesn't seem to be working.

我已经找到了很多使用 Objective-C弹出 2UIViewControllersUINavigationController方法,但是当我尝试将其切换到 Swift 时,它似乎不起作用。

What would be the best approach to pop back to UIViewController? Any guidance would be appreciated Thanks

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

回答by Aaron Wojnowski

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.

扩展我的评论,在 viewControllers 数组中找到倒数第二个视图控制器,然后使用 popToViewController 避免覆盖整个视图控制器堆栈。

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

示例(假设导航控制器有 1 个以上的视图控制器):

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

Objective-C

目标-C

NSArray *viewControllers = [self.navigationController viewControllers];
[self.navigationController popToViewController:viewControllers[viewControllers.count - 3] animated:YES];

回答by Maximelc

I wrote an UIViewController extension (Swift 3+ ready)

我写了一个 UIViewController 扩展(支持 Swift 3+)

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)

回答by Reema

You can dynamically pop multiple viewcontrollers in (swift 2.0)

您可以在 (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)
                            }
                        }

回答by nidhin

user5320485 answer in swift3

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

回答by CodenameDuchess

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

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

 }

回答by Balázs Vincze

Here is another, slightly "fool-proof" version:

这是另一个稍微“万无一失”的版本:

extension UINavigationController {
    func popBack(_ count: Int) {
        guard count > 0 else {
            return assertionFailure("Count can not be a negative value.")
        }
        let index = viewControllers.count - count - 1
        guard index > 0 else {
            return assertionFailure("Not enough View Controllers on the navigation stack.")
        }
        popToViewController(viewControllers[index], animated: true)
    }
}

回答by Davender Verma

 let allViewControllers : [UIViewController] = self.navigationController!.viewControllers as [UIViewController]
        self.navigationController?.popToViewController(allViewControllers[allViewControllers.count-3], animated: true)

回答by Andres Paladines

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 ViewControlleryou can use NavigationHelper.back(number: 1, from: self)

例如,在您ViewController可以使用NavigationHelper.back(number: 1, from: self)