web-dev-qa-db-fra.com

À quoi servent les segments Détendez-vous et comment les utilisez-vous?

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

Les séquences 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 publication 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 fonctionnent les segments de déroulement et à quoi servent-ils?

576
Imre Kelényi

En un mot

Un ndind segue (parfois appelé exit segue) peut être utilisé pour revenir en arrière dans les suivis Push, Modal ou Popover (comme si vous aviez ouvert l'élément de navigation de la barre de navigation, fermé. le popover ou congédié le contrôleur de vue présenté modalement). En plus de cela, vous pouvez vous détendre non seulement par une, mais par une série de séquences Push/modal/popover, par ex. "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 contrôleur de vue sur lequel vous souhaitez vous dérouler.

Objective-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 demander au contrôleur de vue source du paramètre passé UIStoryboardSegue de communiquer avec le contrôleur de vue qui a initié la séquence (par exemple, pour obtenir les valeurs de propriété d'un contrôleur de vue modal). À cet égard, la méthode a une fonction similaire à la méthode prepareForSegue: de UIViewController.

Mise à jour iOS 8: Les séquences de décompression fonctionnent également avec les séquences adaptatives d’iOS 8, telles que Show et Afficher les détails .

Un exemple

Ayons un scénario 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érouler (revenir en arrière) jusqu'à Red View Controller. De bleu, 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 exemple. voici la méthode d'action en rouge:

Objective-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 la séquence de déroulement dans le story-board en faisant glisser la souris jusqu'à l'icône Quitter. Ici, nous voulons passer du rouge au vert lorsque le bouton est enfoncé:

enter image description here

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

enter image description here

Vous pouvez également décompresser du rouge à partir du bleu (qui se trouve à deux pas de la pile de navigation). La clé consiste à sélectionner 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 transition entre le vert et le bleu en rouge. Nous pouvons accéder à la source du déroulement dans la méthode d'action via le paramètre UIStoryboardSegue:

Objective-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énouement fonctionne également à travers une combinaison de séquences push/modales. Par exemple. si j'ajoutais un autre contrôleur de vue jaune avec une séquence modale, nous pourrions passer de Jaune à Red en une seule étape:

enter image description here

Dénouement du code

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

enter image description here

La sélection de la séquence et le passage à l'inspecteur d'attributs font apparaître la propriété "Identifiant". Utilisez ceci pour donner un identifiant unique à votre séquence:

enter image description here

Ensuite, la séquence de déroulement peut être exécutée à partir du code, comme toute autre séquence:

Objective-C:

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

Rapide:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
1260
Imre Kelényi

En ce qui concerne l'utilisation des segments de déroulement dans StoryBoard ...

Étape 1)

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

Objective-C

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

Assurez-vous également de 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, accédez à la vue à partir de laquelle vous souhaitez vous détendre et faites simplement glisser une séquence de votre bouton ou de l’aiguille 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"

Ça y est, votre séquence se déroulera lorsque vous appuierez sur le bouton.

165
Travis M.

Les séquences de retrait sont utilisées pour "revenir en arrière" sur un contrôleur de vue à partir duquel, par un certain nombre de séquences, vous êtes parvenu au contrôleur de vue "actuel".

Imaginez que vous ayez quelque chose de MyNavController avec A en tant que contrôleur de vue racine. Vous utilisez maintenant une séquence Push pour B. Maintenant, le contrôleur de navigation a A et B dans son tableau viewControllers, et B est visible. Maintenant, vous présentez C modalement.

Avec les séquences déroulées, vous pouvez maintenant vous dérouler "de retour" de C à B (c'est-à-dire, en supprimant le contrôleur de vue présenté de manière modale), ce qui revient essentiellement à "annuler" la séquence modale. Vous pouvez même vous détendre complètement jusqu'au contrôleur de vue racine A, en annulant à la fois la séquence modale et la séquence push.

Les détentes facilitent le retour en arrière. Par exemple, avant iOS 6, la meilleure pratique pour ignorer les contrôleurs de vue présentés était de définir le contrôleur de vue présentateur en tant que délégué du contrôleur de vue présenté, puis appeler votre méthode de délégué personnalisé, qui ferme ensuite le contrôleurViewViewController . Cela semble lourd et compliqué? C'était. C’est la raison pour laquelle les détentes se déroulent à Nice.

47
Yang Meyer

Quelque chose que je n'ai pas vu mentionné dans les autres réponses ici est la façon dont vous gérez le déroulement lorsque vous ne savez pas d'où vient le début de la séquence, ce qui pour moi est un cas d'utilisation encore plus important. Par exemple, supposons que vous disposiez d’un contrôleur de vue d’aide (H) que vous affichez de façon modale à partir de deux contrôleurs de vue différents (A et B):

AH
BH

Comment configurez-vous la séquence de déroulement de sorte que vous retourniez au bon contrôleur de vue? 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 trouvera quel contrôleur de vue (A ou B) a initié la transition et y retournera.

En d'autres termes, considérez l'action de déroulement comme une description de l'endroit d'où vient la séquence de , plutôt que de l'endroit où il va.

33
shawkinaw

Swift iOS:

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

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

    println("Called goToSideMenu: unwind action")

}

Étape 2: (StoryBoard) Cliquez avec le bouton droit de la souris sur le bouton EXCAVAGE/ENFANT EXIT et sélectionnez "goToSideMenu" comme action pour vous connecter. Bouton sur lequel vous allez cliquer pour revenir à votre vue du contrôleur MASTER:

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

24
Vinod Joshi

Par exemple, si vous naviguez de viewControllerB à viewControllerA, dans votre viewControllerA ci-dessous, le délégué appelle et les données sont partagées.

@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 sur le contrôleur de vue source Seague (vous devez connecter le bouton de sortie à l’icône de sortie de VC et le connecter à la commande de déroulement:

enter image description here

  • Unwind Seague Completed -> TextLabel of viewControllerA est modifié.

enter image description here

1
Tech