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 ?
Réponses
Trop de publicités?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
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.
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.
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)