Quelles sont Détendez-vous enchaîne et comment les utilisez-vous?

iOS 6 et Xcode 4.5 a une nouvelle fonctionnalité appelée "Unwind Segue":

décompresser les segments peut permettre de passer à 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étendre enchaîne travail et ce qu'ils peuvent être utilisés pour?

552
demandé sur max_ 2012-09-24 12:57:08
la source

6 ответов

en un mot

An unwind segue (parfois appelé exit segue ) peut être utilisé pour naviguer en arrière à travers les segments push, modal ou popover (comme si vous avez sauté l'élément de navigation de la barre de navigation, fermé le popover ou rejeté le contrôleur de vue modally présenté). En plus de cela, vous pouvez réellement décompresser non seulement par une, mais une série de segments push/modal/popover, par exemple "revenir en arrière" plusieurs étapes dans votre hiérarchie de navigation avec une seule action de décompression.

lorsque vous effectuez une séquence de décompression, vous devez spécifier une action, qui est une méthode d'action du contrôleur de vue que vous voulez décompresser.

Objectif-C:

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

Swift:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

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

iOS 8 mise à jour: Détendez-vous enchaîne également fonctionner avec iOS 8 adaptative enchaîne, comme Show et Afficher les Détails .

Un Exemple

nous allons avoir un storyboard avec un contrôleur de navigation et trois contrôleurs de vue d'enfant:

enter image description here

à partir du contrôleur de vue verte, vous pouvez vous détendre (naviguer en arrière) au contrôleur de vue Rouge. Du bleu vous pouvez vous détendre au vert ou au rouge via le vert. Permettre déroulement vous devez ajouter l'action spéciale méthodes de Rouge et de Vert, par exemple, ici est la méthode de l'action en Rouge:

Objectif-C:

@implementation RedViewController

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

@end

Swift:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

après que la méthode d'action a été ajoutée, vous pouvez définir la séquence de décompression dans le storyboard en faisant glisser le contrôle vers l'icône de sortie. Ici, nous voulons se détendre au rouge de vert lorsque le bouton est pressé:

enter image description here

vous devez sélectionner l'action qui est définie dans le contrôleur de vue que vous voulez décompresser à:

enter image description here

vous pouvez également vous détendre au rouge du bleu (qui est" deux pas loin " dans la pile de navigation). La clé est de sélectionner l'action de décompression correcte.

avant le déroulement de la séquence de décompression, la méthode d'action est appelé. Dans l'exemple, j'ai défini une séquence de décompression vers le rouge à partir du vert et du bleu. Nous pouvons accéder à la source de la décompression dans la méthode 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!");
    }
}

Swift:

@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")
    }
}

Unwinding fonctionne également grâce à une combinaison de segments push/modal. Par exemple: si j'ai ajouté un autre contrôleur de vue jaune avec un modal nous pourrions nous détendre du jaune jusqu'au rouge en un seul pas:

enter image description here

Déroulement de Code

lorsque vous définissez une séquence de décompression en glissant quelque chose vers le symbole de sortie d'un contrôleur de vue, une nouvelle séquence apparaît dans le contour du document:

enter image description here

sélectionner la séquence et aller aux attributs L'inspecteur révèle la propriété" identifiant". Utilisez ceci pour donner un identifiant unique à votre séquence:

enter image description here

après cela, la séquence de décompression peut être exécutée à partir du code comme n'importe quelle autre séquence:

Objectif-C:

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

Swift:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
1231
répondu Imre Kelényi 2014-11-21 17:09:04
la source

en ce qui concerne l'utilisation de segments de décompression dans le StoryBoard...

Étape 1)

aller au code pour le contrôleur de vue que vous souhaitez décompresser à et ajouter ceci:

Objectif-C

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

assurez-vous de déclarer également cette méthode dans votre .h fichier en Obj-C

Swift

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

Étape 2)

dans storyboard, allez à la vue à partir de laquelle vous voulez vous détendre et tout simplement faire glisser une séquence à partir de votre bouton ou quoi que ce soit jusqu'à la petite icône orange" sortie " en haut à droite de votre vue source.

enter image description here

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

C'est tout, votre séquence se décompose lorsque votre bouton est activé.

157
répondu Travis M. 2018-03-24 08:39:26
la source

décompresse les segments sont utilisés pour" revenir "à un contrôleur de vue à partir duquel, à travers un certain nombre de segments, vous arrivez au contrôleur de vue" courant".

Imaginez que vous ayez quelque chose d'un MyNavController avec A comme contrôleur de vue racine. Maintenant, vous utilisez une séquence push à B . Maintenant le contrôleur de navigation A et B dans son tableau viewControllers , et B est visible. Maintenant, vous présentez C modalement.

avec décompression, vous pourrait maintenant décompresser "back "de C à B (c'est-à-dire en rejetant le contrôleur de vue modalement présenté), essentiellement en" défaisant " la séquence modale. Vous pouvez même vous détendre jusqu'au contrôleur de la vue racine A , en défaisant à la fois la séquence modale et la séquence push.

décompressez les segments pour qu'il soit facile de revenir en arrière. Par exemple, avant iOS 6, la meilleure pratique pour rejeter les contrôleurs de vue présentés était de définir le contrôleur de vue de présentation comme le délégué du contrôleur de la vue présenté, puis appelez votre méthode de délégué personnalisé, qui rejette alors le contrôleur de viewcontroller présenté . Le son lourd et compliqué? Il était. C'est pourquoi décompresser les segments est agréable.

43
répondu Yang Meyer 2013-02-17 04:51:37
la source

quelque chose que je n'ai pas vu mentionné dans les autres réponses ici, c'est comment gérer la décompression quand vous ne savez pas d'où vient la séquence initiale, ce qui est pour moi un cas d'utilisation encore plus important. Par exemple, supposons que vous ayez un contrôleur de vue d'aide ( H ) que vous affichez modalement à partir de deux contrôleurs de vue différents ( A et B ):

UN H

B H

comment configurer la séquence de décompression pour revenir au contrôleur de vue correct? La réponse est que vous déclarez une action de décompression 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, la décompression trouvera n'importe quel contrôleur de vue ( A ou B ) a initié la séquence et y revenir.

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

29
répondu shawkinaw 2015-12-15 22:33:59
la source

Swift iOS:

Étape 1: définissez cette méthode dans votre vue du contrôleur maître. dans lequel vous voulez revenir:

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

    println("Called goToSideMenu: unwind action")

}

Étape 2: (StoryBoard) clic droit sur le bouton de sortie esclave/enfant et sélectionnez "goToSideMenu" comme action pour connecter le bouton sur lequel vous cliquerez pour revenir à vous Vue Contrôleur Maître:

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

22
répondu Vinod Joshi 2014-11-21 16:39:44
la source

par exemple si vous naviguez de viewControllerB à viewControllerA alors dans votre viewControllerA ci-dessous, delegate appellera et les données se 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étendez-vous Seague Source-Vue-Contrôleur ( vous Devez Vous connecter Bouton Exit pour CR de la sortie de l'icône et de la connecter à unwindseague:

enter image description here

  • Détendez-Vous Seague Terminé -> TextLabel de viewControllerA est modifié.

enter image description here

1
répondu Tech 2017-12-22 17:08:20
la source

Autres questions sur