web-dev-qa-db-fra.com

Contrôler la vue Pop 2 dans le contrôleur de navigation dans Swift

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

29
candidaMan

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)
}
96
Aaron Wojnowski

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)
14
Maximelc

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

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

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

 }
1
CodenameDuchess

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)

0
LagMaster