Fondamentalement, j'ai un bouton dans un menu coulissant (qui est son propre contrôleur de vue qui couvre une partie de l'écran Origin, appelons-le Menu) qui, lorsqu'il est enfoncé, effectue une séquence modale pour un autre contrôleur, disons Destination.

Est-il possible qu'en appuyant sur le bouton dans Menu (pour aller à Destination), je puisse renvoyer Menu vers Origin, et ALORS passer à {{X4 }}?

Cela semble idiot mais c'est quelque chose que je pense avoir déjà vu des applications faire. Dans mon cas, la raison pour laquelle je veux faire cela est qu'une fois que j'appuie sur "Terminé" sur Destination, cela renvoie ce contrôleur à Menu, lorsque je veux simplement qu'il revienne à {{X2 }}. Je ne peux pas simplement effectuer une transition vers Origin depuis Destination.

Code:

Voici comment j'ouvre le Menu depuis Origin:

let interactor = Interactor()

@IBAction func openMenu(_ sender: AnyObject) {
    performSegue(withIdentifier: "openMenu", sender: nil)
}


@IBAction func edgePanGesture(sender: UIScreenEdgePanGestureRecognizer) {
    let translation = sender.translation(in: view)

    let progress = MenuHelper.calculateProgress(translationInView: translation, viewBounds: view.bounds, direction: .Right)

    MenuHelper.mapGestureStateToInteractor(
        gestureState: sender.state,
        progress: progress,
        interactor: interactor){
            self.performSegue(withIdentifier: "openMenu", sender: nil)
    }
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationViewController = segue.destination as? MenuViewController {
        destinationViewController.transitioningDelegate = self
        destinationViewController.interactor = interactor
        destinationViewController.currentRoomID = self.currentRoomID
    }
}

Voici mon prepareForSegue de Menu à Destination actuellement, rien d'extraordinaire:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)

    let inviteVC = segue.destination as! InviteVipViewController
    inviteVC.currentRoomID = self.currentRoomID
}

Et enfin, rejeter Destination n'est qu'un simple

@IBAction func cancelButtonPressed(_ sender: Any) {
    self.dismiss(animated: true, completion: nil)
}

J'ai vu cette question qui est essentiellement ce que j'essaie de faire mais il n'y avait malheureusement pas de réponse: Effectuer une transition après avoir ignoré le swift modal

Désolé si cela semble déroutant, mais si quelqu'un sait de quoi je parle et peut me faire savoir comment je peux configurer les segues / prepareForSegue s pour que cela fonctionne, toute contribution serait appréciée!

5
KingTim 20 avril 2017 à 21:18

3 réponses

Meilleure réponse

Basé sur une modification de this answer, ce qui suit devrait fonctionner:

Dans votre storyboard, supprimez la séquence déclenchée en appuyant sur le bouton de votre menu et accédez à Destination.

Créez une nouvelle séquence qui va du contrôleur de vue d'origine au contrôleur de vue de destination. Cette séquence va être effectuée manuellement.

Lorsque votre option de destination est sélectionnée dans le menu, faites disparaître le menu, puis effectuez la transition de destination sur l'origine, comme ceci:

    // This code goes in Menu, and you should call it when
    //    the menu button is tapped.
    //
    // presentingViewController is Origin
    weak var pvc = self.presentingViewController

    self.dismiss(animated: true) {

        // Menu has been dismissed, but before it is destroyed
        //  it calls performSegue on Origin
        pvc?.performSegue(withIdentifier: "openDestination", sender: nil)
    }

Lorsque la destination est ignorée, vous devriez voir Origine, sans voir du tout Menu.

J'ai testé cela dans un exemple d'application où "Menu" n'était pas une diapositive, mais un contrôleur de vue modale complet, et cela a fonctionné pour moi.

MODIFIER: lors du dépannage avec @KingTim, il a constaté que nous devions câbler la transition de UINavigationController, et non d'origine, à la destination. En effet, Origin est à l'intérieur d'un contrôleur de navigation. Après cette découverte, cela a fonctionné.

12
Community 23 mai 2017 à 11:47

Si votre vue de présentation est intégrée dans un contrôleur de navigation, vous pouvez le faire:

    weak var pvc:UIViewController! = self.presentingViewController?.childViewControllers[0]
    dismiss(animated: true)
    {
        pvc.performSegue(withIdentifier: "SegueID", sender: nil)
    }
1
Timanious 30 mai 2018 à 12:50

Solution simple avec presentingViewController

if let destinationVC = self.presentingViewController as? YourViewController {
    destinationVC.isBooleanPassed = true
    destinationVC.selectedString = "here comes your string"
    destinationVC.selectedInteger = 12345
}

dismiss(animated: true, completion: nil)
0
Antee86 5 mai 2020 à 11:30