Hoe twee weergavecontrollers pushen maar de overgang alleen animeren voor de tweede?

Ik heb drie controllers (FirstVC, SecondVC, ThirdVC) in storyboad en de navigatie is sequentieel: een gebruiker kan navigeren van FirstVC naar SecondVC en vervolgens naar ThirdVC. Nu moet ik een knop maken waarmee ThirdVC vanuit FirstVC wordt geopend, maar waarmee SecondVC ook op de navigatiestack wordt geplaatst, dus wanneer een gebruiker vanuit ThirdVC op terug drukt, wordt hij teruggestuurd naar SecondVC. Ik heb dus geen animatie nodig van FirstVC naar SecondVC, ik hoef alleen maar SecondVC op de navigatiecontroller-stack te duwen en vervolgens alleen de overgang naar ThirdVC te animeren.

Ik kon niet vinden hoe ik animatie uitschakel voor performSegueWithIdentifier, dus ik denk dat ik SecondVC handmatig van het storyboard moet instantiëren, het op de navigatiestack moet plaatsen en dan performSegueWithIdentifier voor ThirdVC moet uitvoeren. Enig idee hoe dat te doen?


Antwoord 1, autoriteit 100%

De oplossing die je zoekt als je in de eerste VC zit:

NSMutableArray *controllers = [self.navigationController.viewControllers mutableCopy];
[controllers addObject:secondVc];
[controllers addObject:thirdVC];
[self.navigationController setViewControllers:controllers animated:YES];

Dit wordt geanimeerd in de thirdVC zonder dat de secondVc zichtbaar wordt in het proces. Wanneer de gebruiker op de terug-knop drukt, keren ze terug naar de tweede Vc


Antwoord 2, autoriteit 30%

Om de standaardanimatie voor het indrukken van een weergavecontroller te behouden, in 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)
}

Hiermee wordt pushVCnormaal weergegeven en wordt backVCin de navigatiestack ingevoegd, waarbij zowel de animatie als de geschiedenis voor de UINavigationControllerbehouden blijven.

Je kunt setViewControllersgebruiken, maar dan verlies je de standaard push-animatie.


Antwoord 3, autoriteit 17%

Snelle versie van KimAMartinsen-oplossing

guard var controllers = self.navigationController?.viewControllers else {
   return
}
guard let firstVC = self.storyboard?.instantiateViewController(withIdentifier: "Tests") as? firstViewController else { 
   return
}
guard let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "Dashboard") as? SecondViewController else {
    return
}
controllers.append(firstVC)
controllers.append(secondVC)
self.navigationController?.setViewControllers(controllers, animated: true)

Antwoord 4, autoriteit 12%

extension UINavigationController {
    open func pushViewControllers(_ inViewControllers: [UIViewController], animated: Bool) {
        var stack = self.viewControllers
        stack.append(contentsOf: inViewControllers)
        self.setViewControllers(stack, animated: animated)
    }
}

Antwoord 5, autoriteit 2%

Hmm, misschien schrijf je gewoon een aangepaste segue die geen animaties doet en zorg ervoor dat de segue in het storyboard verwijst naar je segue-klasse.

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

Link hierboven naar hoe je het kunt maken, IMO-documenten zijn redelijk duidelijk. U kunt vervolgens aanpassen hoe u werkt en verschijnt.

Andere opties zijn de nieuwe protocollen die in iOS7 zijn geïntroduceerd, ervan uitgaande dat je geen oudere apparaten wilt ondersteunen.

Bekijk de Apple Tech Talks 2014-video “Architecting Modern Apps part 1” waarin ze het daar demonstreren.

https://developer.apple.com/tech-talks/videos/

Er zijn veel oplossingen voor uw vraag, hopelijk is een van de bovenstaande oplossingen nuttig. Laat het me weten als dat niet het geval is, dan stel ik een andere voor.

UPDATE:

Een andere optie zou zijn om een ​​tav-weergavecontroller te gebruiken, misschien als dit past bij uw behoeften, aangezien u een navigatiecontroller aan een van de tabbladen kunt toevoegen om dit te bereiken of de tabbladen indien nodig kunt verwisselen.


Antwoord 6

Ik gebruik het volgende fragment om meerdere View Controllers te pushen:

extension UINavigationController {
    func push(_ viewControllers: [UIViewController]) {
        setViewControllers(self.viewControllers + viewControllers, animated: true)
    }
    // Also had this in here, left it in as a bonus :)
    func popViewControllers(_ count: Int) {
        guard viewControllers.count > count else { return }
        popToViewController(viewControllers[viewControllers.count - count - 1], animated: true)
    }
}

Antwoord 7

Ik raad aan om je weergavecontrollers handmatig in te drukken. De eerste zonder animatie:

[self.navigationController pushViewController:SecondVC animated:NO];
[self.navigationController pushViewController:ThirdVC animated:YES];

Other episodes