32 votes

Comment rejeter un modal présenté dans un UIStoryboard avec une séquence modale?

Configuration: j'ai un scénario mis en place, avec deux un simple point de vue des contrôleurs de A et B. Il y a un bouton dans une, que les transitions à B avec un modal segue. B est présenté avec un modal de transition sur le dessus de A. C'est la fin.

Question: est-il un moyen de pop B à l'écart et de revenir à Un avec des simples storyboard de la magie?

Note que si c'était le tout dans une manette de navigation, et j'ai utilisé un push segue, il serait implicitement être pris en charge par la manette de navigation. Il y aurait un bouton "retour". Il n'y a rien de comparable pour les auxiliaires modaux, j'ai besoin de construire l'INTERFACE utilisateur moi-même ce qui est bien, mais je me demande si il y a un segue mécanicien que je peux utiliser pour le signal de revenir de B à A.

Maintenant, le oldskool méthode pour construire de revenir de B à A serait:

  • créez un délégué de propriété sur les B
  • jeu de A à B est délégué lorsque le modal transition segue joue en arrière (je peux accrocher dans cette aide prepareForSegue:expéditeur: dans Un code)
  • quand il est temps de rejeter, B signaux de son délégué
  • Un implémente une méthode du délégué qui rejette B

Cela fonctionne, mais se sent comme trop de frais généraux et stupide.

Est-il un UIStoryboard mécanicien que j'ai manqué, qui serait essentiellement le faire du "reverse modal segue"?

44voto

rickster Points 19870

Il n'y a pas de storyboard de la magie pour licencier un modal-vue-contrôleur sans écrit, au moins un peu de code.

Mais alors que vous avez à mettre en œuvre un code de votre propre, vous n'avez pas nécessairement besoin d'aller à celui de beaucoup de problèmes. Vous pouvez juste avoir un bouton dans la vue contrôleur de B qui appelle [self dismissViewControllerAnimated:YES completion:nil]. (Les docs disent que la présentation de-vue-contrôleur devrait être le seul à le faire disparaître, mais ils disent aussi que le message sera envoyé à la présentation de view controller si elle est appelée sur le presentee. Si vous voulez être plus explicite à ce sujet, et vous aurez besoin pour être, dans certains cas, comme lorsque l'on modal-vue-contrôleur est présenté à partir d'un autre -- vous pouvez faire référence explicitement à la presenter avec self.presentingViewController et appelez - dismiss... à partir de là.)

Vous voyez le délégué des affaires dans certaines applications car c'est une façon de prévenir view controller Un sujet de tout ce que l'utilisateur n'a alors qu'en-vue-contrôleur B... mais ce n'est pas la seule façon. Il y a KVO, les notifications, ou tout simplement d'appeler Une de ses méthodes après le référencement, il avec self.presentingViewController (en supposant que B sait que c'est toujours d'être présenté par Un). Et si l'Un n'a pas besoin de savoir à propos de ce qui s'est passé dans B (dis, parce que l'utilisateur cliquait sur un bouton Annuler), il n'y a pas besoin de faire tout ça, vous pouvez ignorer le modal et être fait avec elle.


Dans iOS 6 et plus tard, vous détendre enchaîne ajouter une autre option, offrant un peu de "storyboard magique" pour rejetant modal vue contrôleurs (ou "sauvegarde" d'une séquence de enchaîne). Mais cette approche nécessite encore un peu de code, vous ne pouvez pas configurer entièrement dans le storyboard. Sur le côté positif, cependant, que le code fournit un chemin d'accès pour obtenir des informations à partir de la vue-contrôleur d'être rejeté (B) à celui qui l'a présenté (Un).

Apple a une note technique sur détendez-vous enchaîne , qui couvre en détail, mais voici la version courte:

  1. Définir un IBAction méthode sur le point de vue de contrôleur de classe, vous voulez vous détendre à -- celui qui présente un modal-vue-contrôleur, pas le modèle-vue-contrôleur lui-même (view controller Un dans votre question). Contrairement à la normale IBAction méthodes, celles-ci prennent un paramètre de type UIStoryboardSegue *; par ex.

    - (IBAction)unwindToMainMenu:(UIStoryboardSegue*)sender
    
  2. Dans la vue-contrôleur (B dans la question), câble de contrôle de la verte à la Sortie de l'icône, puis choisissez la méthode que vous avez défini.

  3. Détendez-vous dans votre implémentation de la méthode, vous pouvez vous référer à la séquence de sourceViewController pour récupérer des informations à partir de la vue du contrôleur d'être rejeté. Vous n'avez pas besoin d'appeler dismissViewControllerAnimated:completion: parce que la séquence des poignées en rejetant le point de vue du contrôleur qui va loin.

30voto

John Erck Points 1614

Il est storyboard de la magie pour atteindre cet objectif. Il est connu comme un déroulement des enchaînements. Dans Un de la .h fichier que vous mettre en œuvre quelle que soit la "cible" de style méthodes que vous avez besoin, cependant, de nombreux détendre enchaîne dont vous avez besoin. Pour un modal, il est généralement de deux (annuler et enregistrer). Donc, à mon A. h de fichier, je voudrais ajouter:

// A.h file
- (IBAction)myCancelUnwindSegueCallback:(UIStoryboardSegue *)segue;
- (IBAction)mySaveUnwindSegueCallback:(UIStoryboardSegue *)segue;

Maintenant, dans votre scénario, si vous avez une séquence de A à B. Vous pouvez maintenant faire une "cible" de style de contrôle, faites glisser à partir de votre annulation/boutons enregistrer en B pour le vert, l'icône "Quitter" au bas de la B contrôleur dans votre storyboard. Lorsque vous faites cela, Xcode va ramasser les deux méthodes que nous avons créé (car ils sont dans le fichier d'en-tête et ils ont de la signature correcte (par exemple, IBAction et UIStoryboardSegue *.) et B est la destination d'une séquence à partir d'Un) Donc, là vous l'avez. Vous avez le storyboard de la magie que vous cherchez!

Dans la mise en œuvre des deux rappels, vous auriez quelque chose comme:

// A.m file
- (IBAction)myCancelUnwindSegueCallback:(UIStoryboardSegue *)segue {
    UIViewController *modalGoingAway = segue.sourceViewController;
    // Do something (like get data) from modalGoingAway if you need to...
}

- (IBAction)mySaveUnwindSegueCallback:(UIStoryboardSegue *)segue {
    UIViewController *modalGoingAway = segue.sourceViewController;
    // Do something (like get data) from modalGoingAway if you need to...
}

Enfin, si cette approche répond à vos besoins, à votre grand. Vous avez terminé. Cependant, j'ai encore le fil de l'ensemble du protocole de délégué/source de données modèle de conception de si "sur annuler" ou "enregistrer" je veux effectuer certaines opérations sur B les propriétés privées avant de passer le contrôle d'Un à supprimer B à partir de la vue de la hiérarchie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X