115 votes

Suppression des contrôleurs de vue de la pile de navigation

J'ai une pile de navigation, avec disons 5 UIViewControllers. Je veux supprimer les 3ème et 4ème contrôleurs de vue de la pile en cliquant sur un bouton dans le 5ème contrôleur de vue. Est-il possible de le faire ? Si oui, comment ?

187voto

Nit Points 4150

Utilisez ce code et profitez :

NSMutableArray *navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers];

// [navigationArray removeAllObjects];    // This is just for remove all view controller from navigation stack.
[navigationArray removeObjectAtIndex: 2];  // You can pass your index here
self.navigationController.viewControllers = navigationArray;
[navigationArray release];

J'espère que ça vous aidera.

Edition : Code Swift

guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
navigationArray.remove(at: navigationArray.count - 2) // To remove previous UIViewController
self.navigationController?.viewControllers = navigationArray

Modifier : Pour supprimer tout ViewController sauf le dernier -> pas de bouton Retour dans le coin supérieur gauche

guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers // To get all UIViewController stack as Array
let temp = navigationArray.last
navigationArray.removeAll()
navigationArray.append(temp!) //To remove all previous UIViewController except the last one
self.navigationController?.viewControllers = navigationArray

53voto

Sourabh Points 474

Vous pouvez d'abord obtenir tous les contrôleurs de vue dans le tableau, puis après avoir vérifié avec la classe de contrôleur de vue correspondante, vous pouvez supprimer celui que vous voulez.

Voici un petit morceau de code :

NSArray* tempVCA = [self.navigationController viewControllers];

for(UIViewController *tempVC in tempVCA)
{
    if([tempVC isKindOfClass:[urViewControllerClass class]])
    {
        [tempVC removeFromParentViewController];
    }
}

Je pense que ça vous facilitera la tâche.

43voto

kuzdu Points 2293

SWIFT 3 et 4/5

self.navigationController!.viewControllers.removeAll()

self.navigationController?.viewControllers.remove(at: "insert here a number")

SWIFT 2,1

supprimer tout :

self.navigationController!.viewControllers.removeAll()

supprimer à l'index

self.navigationController?.viewControllers.removeAtIndex("insert here a number")

Il y a un tas d'autres actions possibles comme removeFirst,range etc.

27voto

Niklas Points 523

SWIFT 5 :

navigationController?.viewControllers.removeAll(where: { (vc) -> Bool in
    if vc.isKind(of: MyViewController.self) || vc.isKind(of: MyViewController2.self) {
        return false
    } else {
        return true
    }
})

20voto

Mitchell C Points 281

SWIFT 5, Xcode 13

J'ai trouvé cette approche simple en spécifiant quel (s) contrôleur(s) de vue vous souhaitez supprimer de la pile de navigation.

extension UINavigationController {
    
    func removeViewController(_ controller: UIViewController.Type) {
        if let viewController = viewControllers.first(where: { $0.isKind(of: controller.self) }) {
            viewController.removeFromParent()
        }
    }
}

Exemple d'utilisation :

navigationController.removeViewController(YourViewController.self)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X