J'ai trois contrôleurs (FirstVC, SecondVC, ThirdVC) à l'intérieur de StoryBoad, et la navigation est séquentielle: un utilisateur peut naviguer de FirstVC à SecondVC, puis à ThirdVC. Maintenant, je dois créer un bouton qui ouvrira ThirdVC à partir de FirstVC mais mettra également SecondVC sur la pile de navigation, donc lorsqu'un utilisateur appuiera sur ThirdVC, il sera renvoyé à SecondVC. Donc, je n'ai pas besoin d'animation de FirstVC à SecondVC, il suffit de pousser SecondVC sur la pile du contrôleur de navigation, puis d'animer uniquement la transition vers ThirdVC.
Je n'ai pas pu trouver comment désactiver l'animation pour performSegueWithIdentifier, donc je pense que je devrais instancier SecondVC à partir du storyboard manuellement, le mettre sur la pile de navigation, puis effectuer performSegueWithIdentifier pour ThirdVC. Des idées pour faire ça?
La solution que vous recherchez si vous êtes dans le premier VC:
NSMutableArray *controllers = [self.navigationController.viewControllers mutableCopy];
[controllers addObject:secondVc];
[controllers addObject:thirdVC];
[self.navigationController setViewControllers:controllers animated:YES];
Cela s'animera dans le troisième VC sans que le second VC ne devienne visible dans le processus. Lorsque l'utilisateur appuie sur le bouton de retour, il reviendra au second Vc
Pour conserver l'animation standard pour pousser un contrôleur de vue, dans Swift:
let pushVC = UIViewController()
let backVC = UIViewController()
if let navigationController = navigationController {
navigationController.pushViewController(pushVC, animated: true)
let stackCount = navigationController.viewControllers.count
let addIndex = stackCount - 1
navigationController.viewControllers.insert(backVC, atIndex: addIndex)
}
Cela affiche pushVC
normalement et insère backVC
dans la pile de navigation, préservant à la fois l'animation et l'historique du UINavigationController
.
Vous pouvez utiliser setViewControllers
, mais vous perdrez l'animation Push standard.
Version Swift de la solution KimAMartinsen
let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "Tests") as! firstViewController
let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "Dashboard") as! SecondViewController
var controllers = self.navigationController?.viewControllers
controllers?.append(firstVC)
controllers?.append(secondVC)
self.navigationController?.setViewControllers(controllers!, animated: true)
extension UINavigationController {
open func pushViewControllers(_ inViewControllers: [UIViewController], animated: Bool) {
var stack = self.viewControllers
stack.append(contentsOf: inViewControllers)
self.setViewControllers(stack, animated: animated)
}
}
Hmm peut-être juste écrire une séquence personnalisée qui ne fait aucune animation et assurez-vous que la séquence dans le storyboard référence votre classe de séquence.
Lien ci-dessus pour savoir comment le créer, les documents IMO sont assez explicites. Vous pouvez ensuite personnaliser la façon dont vos séquences fonctionnent et apparaissent.
Les autres options incluent les nouveaux protocoles introduits dans iOS7 en supposant que vous ne souhaitez pas prendre en charge les appareils plus anciens.
Regardez la vidéo Apple Tech Talks 2014 "Architecting Modern Apps part 1", ils y font une démonstration.
https://developer.Apple.com/tech-talks/videos/
Il existe de nombreuses solutions à votre question. J'espère que l'une des réponses ci-dessus est utile, faites-moi savoir si ce n'est pas le cas et je vous en proposerai une autre.
MISE À JOUR:
Une autre option serait peut-être d'utiliser un contrôleur de vue tav si cela correspond à vos besoins, car vous pouvez ajouter un contrôleur de navigation à l'un des onglets pour y parvenir ou permuter les onglets selon les besoins.
Je suggère de pousser vos contrôleurs de vue manuellement. Le premier sans animation:
[self.navigationController pushViewController:SecondVC animated:NO];
[self.navigationController pushViewController:ThirdVC animated:YES];