web-dev-qa-db-fra.com

Comment pousser deux contrôleurs de vue mais animer la transition uniquement pour le second?

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?

46
Centurion

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

77
KimHafr

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.

25
David Smith

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)
6
Salem Binmusaed
extension UINavigationController {
    open func pushViewControllers(_ inViewControllers: [UIViewController], animated: Bool) {
        var stack = self.viewControllers
        stack.append(contentsOf: inViewControllers)
        self.setViewControllers(stack, animated: animated)
    }
}
4
Al Zonke

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.

https://developer.Apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomSegues/CreatingCustomSegues.html

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.

2
AppHandwerker

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];
0
Ortwin Gentz