J'ai trouvé plusieurs façons de revenir en arrière 2 UIViewControllers
dans UINavigationController
en utilisant Objective-C, mais lorsque j'essaie de passer cela à Swift, il ne semble pas fonctionner.
Quelle serait la meilleure approche pour revenir à UIViewController
? Toute orientation serait appréciée Merci
En développant mon commentaire, recherchez l'avant dernier contrôleur de vue dans le tableau viewControllers, puis utilisez popToViewController pour éviter de remplacer toute la pile de contrôleur de vue.
Exemple (en supposant que le contrôleur de navigation dispose de plus d'un contrôleur de vue):
func backTwo() {
let viewControllers: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]
self.navigationController!.popToViewController(viewControllers[viewControllers.count - 3], animated: true)
}
J'ai écrit une extension UIViewController (prêt pour Swift 3+)
Vous pourriez utiliser comme ceci:
/// 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
}
}
}
Utilisation:
self.popBack(3)
Bonus de rejeter à un viewcontroller spécifique
/// 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
}
}
}
}
Utilisation:
self.popBack(toControllerType: MyViewController.self)
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)
}
}
Vous pouvez ajouter dynamiquement plusieurs contrôleurs de vue dans (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)
}
}
Version de l'extension Swift 4 UINavigationController de @ 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
}
}
}
}
J'ai fait une aide pour rendre les choses faciles:
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)
}
}
Par exemple, dans votre ViewController
, vous pouvez utiliser NavigationHelper.back(number: 1, from: self)