web-dev-qa-db-fra.com

Détendez-vous à partir du bouton de navigation retour dans Swift

J'ai un écran de paramètres, en ce sens que j'ai une cellule de tableau. En cliquant dessus, je passe à un autre écran où l'utilisateur peut choisir une option et que je veux la rétablir dans le contrôleur de vue précédent lorsque le bouton Précédent est enfoncé.

image first view controllerimage second view controller

Je peux mettre un élément de bouton de barre personnalisé, mais je souhaite revenir au contrôleur de vue parent à l'aide du bouton Précédent dans la barre de navigation plutôt que d'un bouton personnalisé dans la vue.

Il semble que je ne puisse pas ignorer le bouton de navigation arrière pour le pointer vers mon action de déroulement et que le bouton de retour n'apparaissant pas sur le scénario, je ne peux pas y faire glisser le bouton vert de sortie

Est-il possible de dérouler une séquence Push avec le bouton de retour?

16
Raghavendra

Voici ma solution, basée sur le code Objective-C de Blankarsch à cette question de StackOverflow: Comment intercepter l'événement du bouton Précédent

Placez ce code dans le contrôleur de vue à partir duquel vous souhaitez intercepter l'appel du bouton Précédent:

override func didMoveToParentViewController(parent: UIViewController?) {
    if (!(parent?.isEqual(self.parentViewController) ?? false)) {
        println("Back Button Pressed!")
    }
}

À l'intérieur du bloc if, gérez tout ce dont vous avez besoin pour revenir. Vous aurez également besoin d'une référence sur l'appel du contrôleur de vue car, à ce stade, les parents et self.parentViewController sont probablement nuls. Vous ne pouvez donc pas naviguer dans l'arborescence de View Controller.

En outre, vous pourrez peut-être vous contenter de simplement vérifier si le parent est nuls, car je n’ai pas trouvé de cas où appuyer sur le bouton Précédent n’a pas pour résultat que le parent est nul. Donc, quelque chose comme ceci est un peu plus concis:

override func didMoveToParentViewController(parent: UIViewController?) {
    if (parent == nil) {
        println("Back Button Pressed!")
    }
}

Mais je ne peux pas garantir que cela fonctionnera à chaque fois.

Andrew

3
Big Red

Dans le contrôleur de vue, procédez comme suit: a le bouton Précédent

Swift 3

override func didMove(toParentViewController parent: UIViewController?) {
    if !(parent?.isEqual(self.parent) ?? false) {
        print("Parent view loaded")
    }
    super.didMove(toParentViewController: parent)
}
2
John R Perry

J'ai essayé la même chose et il semble que vous ne puissiez pas saisir l'action du bouton retour standard. La solution consiste donc à utiliser un bouton personnalisé et à le lier à un segment qui mène à la page précédente.

0
zisoft

Vous pouvez utiliser une sorte de délégation comme vous l'avez fait ou utiliser un bouton de retour personnalisé et une séquence de déroulement.

Mieux encore, vous pourriez gérer le transfert de données entre vos contrôleurs de vue à l'aide d'un médiateur:

http://cocoapatterns.com/passing-data-between-view-controllers/

0
joakim