L'utilisation du storyboard est très simple. Vous faites simplement glisser l'action sur "Quitter". Mais comment dois-je l'appeler à partir de mon code?
L'utilisation du storyboard est très simple. Vous faites simplement glisser l'action sur "Quitter". Mais comment dois-je l'appeler à partir de mon code?
Réponses:
Insérez le nom de Segue pour vous détendre.
Ensuite, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
avec votre identifiant de séquence.
Voici une réponse complète avec Objective C et Swift:
1) Créez un IBAction
enchaînement de déroulement dans votre contrôleur de vue de destination (où vous souhaitez effectuer un enchaînement). 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 dont vous effectuez la transition), ⌃ + faites glisser depuis "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 en revue la première étape). Choisissez unwindToContainerVC: dans la fenêtre contextuelle, ou tout ce que vous avez nommé votre méthode pour connecter votre contrôleur source à l'IBAction dérouler.
3) Sélectionnez la séquence dans le plan du document du contrôleur de vue source du storyboard (il sera répertorié vers le 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 votre nom de 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 sur le contrôleur source. Notez également que le cadre gère la fermeture du contrôleur source. Si vous souhaitez confirmer cela, ajoutez une méthode de désallocation 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 rétention.
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
du ViewController
au a Exit
été extrêmement utile. Merci!
bradleygriffith
La réponse a été excellente. J'ai pris l'étape 10 et fait une capture d'écran pour simplifier. Il s'agit d'une capture d'écran dans Xcode 6.
unwind segue
dans la barre latérale:[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
. Ensuite, votre solution fonctionnera
J'ai utilisé [self dismissViewControllerAnimated: YES completion: nil];
ce qui vous ramènera à l'appel ViewController
.
Citation du texte de la note technique d'Apple sur la séquence de déroulement: pour ajouter une séquence de déroulement qui ne sera déclenchée que par programme, contrôlez + faites glisser de l'icône du contrôleur de vue de la scène vers 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 cela afin de déclencher manuellement la seque en utilisant:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
à partir du ViewController, vous devez également sélectionner la séquence de déroulement sous la scène du ViewController dans le storyboard et dans la vue des propriétés sur le RHS, assurez-vous que le champ Indentifier contient le namer auquel vous faites référence dans le code ("mySegueName" dans l'exemple ci-dessus). ).
Si vous omettez cette étape, la ligne ci-dessus lèvera une exception indiquant que le nom de la séquence n'est pas connu.
Solution rétrocompatible 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;
}
}
}
SWIFT 4 :
1. Créez une @IBAction avec enchaînement à l'intérieur du contrôleur que vous souhaitez vous détendre:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2. Dans le storyboard, à partir du contrôleur que vous souhaitez séparer (dérouler) de ctrl + faire glisser du signe du contrôleur vers le signe de sortie et choisissez la méthode que vous avez créée précédemment:
3. Vous pouvez maintenant remarquer que dans le plan du document, vous avez une nouvelle ligne avec le titre "Se dérouler 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é! Maintenant, vous devez ouvrir le contrôleur de vue dont vous souhaitez vous détendre et créer une méthode qui effectuera la séquence. Par exemple, vous pouvez ajouter un bouton, le connecter avec du code avec @IBAction , après cela, à l'intérieur de cette IBAction, ajoutez la méthode perfromSegue (withIdentifier: sender :) :
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
C'est tout ce que vous avez à faire!
Pour ceux qui se demandent comment faire cela avec des VC non configurés via le storyboard (ceux qui viennent à cette question en recherchant "par programmation" + "se détendre segue").
Étant donné que vous ne pouvez pas configurer une séquence de déroulement par programme, la solution uniquement programmatique la plus simple consiste à appeler:
navigationController?.popToRootViewController(animated: true)
qui fera revenir tous les contrôleurs de vue de la pile vers votre contrôleur de vue racine.
Pour faire apparaître uniquement le contrôleur de vue le plus haut de la pile de navigation, utilisez:
navigationController?.popViewController(animated: true)
FYI: Pour que la réponse de @ Vadim fonctionne avec une action de déroulement manuel appelée à partir d'un View Controller, vous devez placer la commande:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
à l'intérieur de la méthode de classe surchargée viewDidAppear comme ceci:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
Si vous le placez dans d'autres méthodes ViewController comme viewDidLoad ou viewWillAppear, il sera ignoré.
performSegueWithIdentfier
fait exactement cela: effectuer la transition d'un ViewController à un autre