Utiliser le storyboard est très facile. Vous faites simplement glisser l'action vers "Quitter". Mais comment dois-je l'appeler depuis mon code?
Insérer le nom de la séquence à décompresser.
Ensuite, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
avec votre identifiant de lieu.
Voici une réponse complète avec Objective C et Swift:
1) Créez un IBAction
_ déroulement de la séquence dans votre contrôleur de vue de destination (où vous souhaitez effectuer la séquence). N'importe où dans le fichier d'implémentation.
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
2) Sur le contrôleur de vue source (le contrôleur que vous êtes en train de quitter), + déplacez le curseur de "Nom de l'activité" pour quitter. Vous devriez voir la séquence de déroulement créée à l’étape 1 dans la fenêtre contextuelle. (Si vous ne le voyez pas, passez à l’étape 1). Choisissez unwindToContainerVC: dans la fenêtre contextuelle, ou quel que soit le nom que vous avez donné à votre méthode pour connecter votre contrôleur source à l'IBAction de déroulement.
3) Sélectionnez le segment dans le contour du storyboard du contrôleur de la vue source (il sera listé près du bas) et attribuez-lui un identifiant.
4) Appelez la séquence de déroulement à l’aide de cette méthode à partir du contrôleur de vue source en remplaçant le nom de la séquence de déroulement.
// Objectif c
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// Rapide
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB Utilisez la propriété sourceViewController du paramètre segue sur la méthode de déroulement pour accéder aux propriétés exposées du contrôleur source. En outre, notez que la structure gère la suppression du contrôleur de source. Si vous souhaitez le confirmer, ajoutez une méthode dealloc au contrôleur source avec un message de journal qui devrait se déclencher une fois qu'il a été tué. Si dealloc ne se déclenche pas, vous pouvez avoir un cycle de conservation.
La réponse de bradleygriffith
était excellente. J'ai pris l'étape 10 et fait une capture d'écran pour simplifier. Ceci est une capture d'écran dans Xcode 6.
Il vous suffit de faire glisser l’icône orange vers l’icône rouge de sortie pour créer un déroulement sans action ni bouton dans la vue.
Puis sélectionnez le unwind segue
et définissez un identifiant pour y accéder à partir du code.
Dans du code,
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
J'ai utilisé [self dismissViewControllerAnimated: YES completion: nil];
qui vous ramènera à l'appelant ViewController
.
Citation de texte à partir de la note technique d'Apple sur Unwind Segue: pour ajouter une séquence de déroulement qui ne sera déclenchée que par programme, faites glisser tout en appuyant sur l'icône de contrôleur de vue de la scène jusqu'à son icône de sortie, puis sélectionnez une action de déroulement pour la nouvelle séquence dans le menu contextuel.
La réponse de Vishal Chaudhry ci-dessus a fonctionné pour moi. J'ajouterais également que pour déclencher manuellement le seque en utilisant:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
à partir de ViewController, vous devez également sélectionner la séquence de déroulement sous la scène de ViewController dans le storyboard et dans la vue des propriétés de RHS, pour vous assurer que le champ Indentifier contient le nom auquel vous faites référence dans le code ("mySegueName" dans l'exemple ci-dessus. ).
Si vous omettez cette étape, la ligne ci-dessus générera une exception indiquant que le nom de paire est inconnu.
Solution compatible avec les versions antérieures qui fonctionnera pour les versions antérieures à ios6, pour les personnes intéressées:
- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {
for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
if ([vc isKindOfClass:vcClass]) {
[self.navigationController popToViewController:vc animated:animated];
return;
}
}
}
Pour ceux qui se demandent comment faire cela avec les VC non configurés via le storyboard (ceux qui arrivent à cette question après une recherche "` par programme "+" undind segue ").
Étant donné que vous ne pouvez pas configurer une séquence de déroulement par programmation, la solution la plus simple, uniquement par programmation, consiste à appeler:
navigationController?.popToRootViewController(animated: true)
ce qui fera apparaître tous les contrôleurs de vue de la pile sur votre contrôleur de vue racine.
Swift 4 :
1. Créez un @ IBAction avec le contrôleur à l'intérieur du contrôleur que vous souhaitez décompresser. à:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2. Dans le storyboard, à partir du contrôleur que vous souhaitez séparer (dérouler) de Ctrl + glisser du signe du contrôleur pour quitter le signe et choisir la méthode que vous avez créée. plus tôt:
3. Vous pouvez maintenant remarquer que dans le plan du document, vous avez une nouvelle ligne avec le titre "Unwind segue ....". Maintenant, vous devez cliquer sur cette ligne et ouvrir l'inspecteur d'attributs pour définir l'identifiant (dans mon cas unwindSegueIdentifier ).
4. Vous avez presque terminé! Vous devez maintenant ouvrir le contrôleur de vue à partir duquel vous souhaitez vous détendre et créer une méthode qui effectuera le suivi. Par exemple, vous pouvez ajouter un bouton, le connecter avec le code avec @ IBAction , après cela, dans cet élément IBAction ajouter perfromSegue (withIdentifier: expéditeur:) méthode:
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
C'est tout ce que vous avez à faire!
FYI: Pour que la réponse de @ Vadim fonctionne avec une action de détente manuelle appelée depuis un contrôleur de vue, vous devez passer la commande suivante:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
à l'intérieur de la méthode de classe overriden viewDidAppear comme ceci:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
Si vous le mettez dans d'autres méthodes ViewController comme viewDidLoad ou viewWillAppear, il sera ignoré.