À quoi servent les enstringments 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 input dans les notes de version de Xcode 4.5, UIViewController semble maintenant avoir quelques nouvelles methods:

- (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:(NSSsortingng *)identifier 

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

    En un mot

    Un segue déroulant (parfois appelé segue de sortie ) peut être utilisé pour revenir en arrière dans les segments push, modal ou popover (comme si vous aviez déplacé l'élément de navigation de la barre de navigation, fermé le popover ou rejeté le controller de vue modal). En plus de cela, vous pouvez vous détendre non seulement par une série de poussées push / modal / popover, par exemple "revenir en arrière" plusieurs étapes 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 controller 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 get le controller de vue source à partir du paramètre UIStoryboardSegue transmis pour interagir avec le controller de vue qui a initié la segue (par exemple pour get les valeurs de propriété d'un controller de vue modale). À cet égard, la méthode a une fonction similaire à la méthode prepareForSegue: de UIViewController .

    Mise à jour iOS 8: les segueuses Unwind fonctionnent également avec les séquences adaptatives d'iOS 8, telles que Afficher et afficher les détails .

    Un exemple

    Avons un storyboard avec un controller de navigation et trois controllers de vue enfant:

    entrez la description de l'image ici

    À 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 append les methods d'actions spéciales au rouge et au vert, par exemple 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 button est enfoncé:

    entrez la description de l'image ici

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

    entrez la description de l'image ici

    Vous pouvez également vous détendre à Red from Blue (qui est "à deux pas" dans la stack de navigation). La key 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 controller de vue jaune avec un segue modal, nous pourrions nous détendre à partir de Jaune jusqu'à Red en une seule étape:

    entrez la description de l'image ici

    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 controller de vue, une nouvelle section apparaît dans le plan de document:

    entrez la description de l'image ici

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

    entrez la description de l'image ici

    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) 

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

    Étape 1)

    Accédez au code du controller de vue auquel vous souhaitez vous déconnecter et ajoutez-le:

    Objectif c

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

    Veillez également à déclarer cette méthode dans votre file .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 button ou de n'importe quoi jusqu'à la petite icône orange "EXIT" en haut à droite de votre vue source.

    entrez la description de l'image ici

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

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

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

    Imaginez que vous avez quelque chose comme un MyNavController avec A comme controller de vue racine. Maintenant, vous utilisez une séquence de poussée à B Maintenant, le controller de navigation a A et B dans son tableau viewControllers , et B est visible. Maintenant, vous présentez C modalement.

    Avec des segues de déroulement, vous pouvez maintenant dérouler "arrière" de C vers B (c'est-à-dire en rejetant le controller de vue modalement présenté), en "défaisant" fondamentalement la section modale. Vous pouvez même vous détendre tout le long du controller de vue racine A , annulant à la fois le segue modal et le segue poussé.

    Les segueuses déroulantes facilitent le return en arrière. Par exemple, avant iOS 6, la meilleure méthode pour ignorer les controllers de vue présentés consistait à définir le controller de présentation en tant que délégué du controller de vue présenté, puis à appeler votre méthode déléguée personnalisée, ce qui a pour effet de rejeter la vue présentéeController . Son lourd et compliqué? C'était. C'est pourquoi les séances de relaxation sont agréables.

    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, supposons que vous ayez un controller d'affichage d'aide ( H ) que vous affichez de manière modale à partir de deux controllers de vue différents ( A et B ):

    AH
    BH

    Comment configurer la séquence de déroulement pour revenir au controller de vue correct? La réponse est que vous déclarez une action de déroulement dans A 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 finda le controller de vue ( A ou B ) qui initiera le segue et y returnnera.

    En d'autres termes, pensez à l'action de décompression comme décrivant d'où vient la séquence, plutôt que d'où elle va.

    Swift iOS:

    Étape 1: définissez cette méthode dans votre vue de controller MASTER. dans lequel tu veux returnner:

     //pragma mark - Unwind Seques @IBAction func goToSideMenu(segue: UIStoryboardSegue) { println("Called goToSideMenu: unwind action") } 

    Étape 2: (StoryBoard) Faites un clic droit sur votre button SLAVE / CHILD EXIT et select "goToSideMenu" Comme action pour vous connecter sur le button sur lequel vous cliquerez pour revenir à la vue du controller MASTER:

    entrez la description de l'image ici Étape 3: Construire et exécuter …