Question À quoi servent les enchaînements de Unwind et comment les utilisez-vous?


iOS 6 et Xcode 4.5 ont une nouvelle fonctionnalité appelée "Sew Segue":

Les segues de déroulement peuvent permettre la transition vers des instances existantes de scènes dans un storyboard

En plus de cette brève entrée dans les notes de version de Xcode 4.5, UIViewController semble maintenant avoir quelques nouvelles méthodes:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

Comment se déroulent les segues travail et à quoi ils peuvent être utilisés?


547
2017-09-24 08:57


origine


Réponses:


En un mot

Un dérouler segue (appelé quelques fois sortie segue) peut être utilisé pour revenir en arrière dans les sonneries push, modal ou popover (comme si vous aviez déplacé l'élément de navigation de la barre de navigation, fermé le survol ou rejeté le contrôleur de vue présenté de façon modale). En plus de cela, vous pouvez vous détendre grâce à une série de sonneries push / modal / popover, par exemple. "revenir en arrière" étapes multiples dans votre hiérarchie de navigation avec une seule action de déroulement.

Lorsque vous effectuez une séquence de déroulement, vous devez spécifier une action, qui est une méthode d'action du contrôleur de vue auquel vous souhaitez vous déconnecter.

Objectif c:

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

Rapide:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

Le nom de cette méthode d'action est utilisé lorsque vous créez la séquence de déroulement dans le storyboard. De plus, cette méthode est appelée juste avant que la séquence de déroulement ne soit effectuée. Vous pouvez obtenir le contrôleur de vue source à partir du passé UIStoryboardSegue paramètre pour interagir avec le contrôleur de vue qui a initié le segue (par exemple pour obtenir les valeurs de propriété d'un contrôleur de vue modale). À cet égard, la méthode a une fonction similaire à prepareForSegue: méthode de UIViewController.

iOS 8 mise à jour: Les segueurs Unwind fonctionnent également avec les séquences adaptatives d'iOS 8, telles que Montrer et Montrer les détails.

Un exemple

Avons un storyboard avec un contrôleur de navigation et trois contrôleurs de vue enfant:

enter image description here

À partir de Green View Controller, vous pouvez vous détendre (revenir en arrière) vers Red View Controller. De Blue, vous pouvez vous détendre au vert ou au rouge via le vert. Pour activer le déroulement, vous devez ajouter les méthodes d'action spéciales à Rouge et Vert, par ex. Voici la méthode d'action en rouge:

Objectif c:

@implementation RedViewController

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}

@end

Rapide:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

Une fois la méthode d'action ajoutée, vous pouvez définir le déroulement de la séquence dans le storyboard en faisant glisser le contrôle sur l'icône Quitter. Ici, nous voulons dérouler à Red from Green lorsque le bouton est enfoncé:

enter image description here

Vous devez sélectionner l'action définie dans le contrôleur de vue auquel vous souhaitez vous déconnecter:

enter image description here

Vous pouvez également vous détendre à Red from Blue (qui est "à deux pas" dans la pile de navigation). La clé sélectionne l'action de déroulement correcte.

Avant que la séquence de déroulement ne soit effectuée, la méthode d'action est appelée. Dans l'exemple, j'ai défini une séquence de déroulement en rouge à la fois en vert et en bleu. Nous pouvons accéder à la source du déroulement dans la méthode d'action via le paramètre UIStoryboardSegue:

Objectif c:

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
    UIViewController* sourceViewController = unwindSegue.sourceViewController;

    if ([sourceViewController isKindOfClass:[BlueViewController class]])
    {
        NSLog(@"Coming from BLUE!");
    }
    else if ([sourceViewController isKindOfClass:[GreenViewController class]])
    {
        NSLog(@"Coming from GREEN!");
    }
}

Rapide:

@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
    if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
        println("Coming from BLUE")
    }
    else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
        println("Coming from RED")
    }
}

Le déroulement fonctionne également grâce à une combinaison de sigles push / modal. Par exemple. si j'ajoutais un autre contrôleur de vue jaune avec un segue modal, nous pourrions nous détendre de Yellow jusqu'à Red en une seule étape:

enter image description here

Se dérouler du code

Lorsque vous définissez une séquence de déroulement par un contrôle en faisant glisser quelque chose vers le symbole de sortie d'un contrôleur de vue, une nouvelle section apparaît dans le plan de document:

enter image description here

La sélection de la section et l'accès à l'inspecteur des attributs révèle la propriété "Identifier". Utilisez ceci pour donner un identifiant unique à votre segue:

enter image description here

Après cela, la séquence de déroulement peut être effectuée à partir du code comme n'importe quelle autre section:

Objectif c:

[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];

Rapide:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)

1226
2018-04-05 16:49



En ce qui concerne la façon d'utiliser dérouler segues dans StoryBoard ...

Étape 1) 

Accédez au code du contrôleur de vue que vous souhaitez se détendre et ajoutez ceci:

Objectif c

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
    //nothing goes here
}

Veillez également à déclarer cette méthode dans votre fichier .h dans Obj-C

Rapide

@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
    //nothing goes here
}

Étape 2) 

Dans le storyboard, allez dans la vue dont vous voulez vous défaire et faites simplement glisser une segue à partir de votre bouton ou de n'importe quoi jusqu'à la petite icône orange "EXIT" en haut à droite de votre vue source.

enter image description here

Il devrait maintenant y avoir une option pour se connecter à "- unwindToViewControllerNameHere"

Voilà, votre segue va se détendre lorsque votre bouton est exploité.


155
2017-10-11 16:07



Les segmes de déroulement sont utilisés pour "revenir" à un contrôleur de vue à partir duquel, à travers un certain nombre de segments, vous êtes arrivé au contrôleur de vue "en cours".

Imaginez que vous avez quelque chose MyNavController avec A comme son contrôleur de vue racine. Maintenant, vous utilisez un segue pousser à B. Maintenant, le contrôleur de navigation a A et B dans son viewControllers tableau, et B est visible. Maintenant vous présentez C modalement.

Avec dérouler segues, vous pouvez maintenant vous détendre "retour" de C à B (c'est-à-dire en rejetant le contrôleur de vue présenté de manière modale), en "annulant" en fait la séquence modale. Vous pouvez même vous détendre tout le chemin du contrôleur de vue racine A, défaisant à la fois le segue modal et le segue poussé.

Les segueuses déroulantes facilitent le retour en arrière. Par exemple, avant iOS 6, la meilleure pratique pour ignorer les contrôleurs de vue présentés consistait à définissez le contrôleur de vue de présentation en tant que délégué du contrôleur de vue présenté, puis appelez votre méthode de délégué personnalisé, qui rejette ensuite le contrôleur de présentation. Son lourd et compliqué? C'était. C'est pourquoi les séances de relaxation sont agréables.


43
2017-10-02 12:43



Quelque chose que je n'ai pas vu mentionné dans les autres réponses ici est comment vous vous débrouillez quand vous ne savez pas d'où est originaire le segue, ce qui est pour moi un cas d'utilisation encore plus important. Par exemple, disons que vous avez un contrôleur de vue d'aide (H) que vous affichez modalement à partir de deux contrôleurs de vue différents (UNE et B):

UNE → H
B → H

Comment configurer la séquence de déroulement pour revenir au contrôleur de vue correct? La réponse est que vous déclarez une action de déroulement dans UNE et B  avec le même nom, par exemple.:

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

De cette façon, le déroulement trouvera n'importe quel contrôleur de vue (UNE ou B) a initié la segue et y retourne.

En d'autres termes, pensez à l'action de décompression comme décrivant l'endroit où le segue arrive deplutôt que d'où ça va.


29
2017-12-15 19:33



Swift iOS:

Étape 1: définissez cette méthode dans votre vue de contrôleur MASTER. dans lequel tu veux retourner:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

Étape 2: (StoryBoard) Faites un clic droit sur votre bouton SLAVE / CHILD EXIT et sélectionnez "goToSideMenu" En tant qu'action pour vous connecter sur le bouton sur lequel vous cliquerez pour revenir à la vue du contrôleur MASTER:

enter image description here Étape 3: Construire et exécuter ...


22
2017-11-21 13:39



Par exemple si vous naviguez de viewControllerB à viewControllerA puis dans votre viewControllerA ci-dessous délégué appellera et les données partageront.

@IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
        if sender.source is ViewControllerB  {
            if let _ = sender.source as? ViewControllerB {
                self.textLabel.text = "Came from B = B->A , B exited"
            }
            
        }

}
  • Désactivez Seague Source View Controller (Vous devez connecter le bouton Exit à l'icône de sortie de VC et connectez-le à unwindseague:

enter image description here

  • Unwind Seague Terminé -> TextLabel de viewControllerA est modifié.

enter image description here


1
2017-12-22 14:08