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
Pop 2 view controllers in Nav Controller in Swift
提问by candidaMan
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 doesn't seem to be working.
我已经找到了很多使用 Objective-C弹出 2UIViewControllers
的UINavigationController
方法,但是当我尝试将其切换到 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 ViewController
you can use NavigationHelper.back(number: 1, from: self)
例如,在您ViewController
可以使用NavigationHelper.back(number: 1, from: self)