Comment faire quelque chose avant de se défouler?
J'ai juste compris qu'est ce qu'un de vous détendre segue et comment l'utiliser avec les grandes réponses de cette question. Merci beaucoup.
Cependant, voici une question comme ça:
Disons qu'il s'agit d'un bouton de scène B, détendez-vous enchaîne à la scène Un, et avant qu'elle enchaîne, je veux quelque chose à faire, comme l'enregistrement de données dans la base de données. J'ai créé une action de ce bouton dans B. swift, mais il semble qu'il va directement à la scène Un sans l'action nommé.
Quelqu'un sait pourquoi ou comment faire cela?
Merci.
source d'informationauteur Mechanic
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire de la manière que vous décrivez, ou à l'aide d'un
prepareForSegue
fonction override dans le viewController vous êtes déroulement à partir de:ou...
Le premier exemple est comme vous le décrivez. Le bouton est programmé pour le déroulement des enchaînements et le bouton d'action dans Interface Builder. Le bouton d'action sera déclenchée avant la séquence de l'action. Peut-être que vous ne connectez pas l'action du bouton dans l'interface builder?
Le deuxième exemple vous donne accès à la séquence de
sourceViewController
etdestinationViewController
dans le cas où cela est également utile (vous obtenez également dans le déroulement des enchaînements en fonction de la destination-vue-contrôleur).Si vous voulez retarder le déroulement des enchaînements jusqu'à ce que le bouton de action locale est terminée, vous pouvez appeler la séquence directement à partir du bouton d'action (au lieu de le brancher dans la table de montage séquentiel) à l'aide de
self.performSegueWithIdentifier
(ou suivez wrUS61 la suggestion)MODIFIER
vous semblez avoir quelques doutes que vous pouvez travailler ce par le câblage de votre bouton à la fois à un déroulement des enchaînements et d'un bouton d'action. J'ai mis en place un petit projet de test comme ceci:
BlueViewController a un bouton qui est connecté dans le storyboard à la FOIS à l'
unwindToRed
détendez-vous des enchaînements ET de laactionForUnwindButton
bouton. Il remplace également lesprepareForSegue
donc, nous pouvons nous connecter l'ordre de jeu.De sortie:
Storyboard:
EDIT 2
votre projet de démonstration montre ce pas de travail. La différence est que vous utilisez un barButtonItem pour déclencher l'action, alors que je suis à l'aide d'un bouton habituel. Un barButtonItem échoue, alors qu'un bouton habituel réussit. Je suspect que cela est dû à des différences dans l'ordre de passage de messages (ce qui suit est une conjecture, mais s'adapte avec le comportement observé):
(A) UIButton en-Vue-Contrôleur
ViewController du bouton reçoit touchupInside
- (1) envoie de l'action à la méthode
- (2) envoie segue détendre action de storyboard segue
tous les messages reçus, et les méthodes exécutées dans cet ordre:
(B) UIBarButtonItem en manette de Navigation de la Barre d'outils
Barre d'outils buttonItem reçoit touchupInside
- (1) envoie segue détendre action de storyboard segue
- (2) (éventuellement, à l'époque) envoie d'action pour viewController la méthode de
Ordre d'exécution est
prepareForSegue
etunwind
les messages reçus. CependantactionForUnwindButton
message est envoyé à néant viewController est détruit au cours de la séquence. Donc il n'a pas été exécuté, et le journal s'imprimeDans le cas de (B), le viewController est détruit avant que la méthode atteint, afin de ne pas se déclencher
Il semble donc que vos options sont...
(a) utiliser une UIButton avec de l'action et de vous détendre segue
(b) qui déclenchent vos actions à l'aide de
prepareForSegue
, qui sera déclenché lorsque le viewController est encore vivant, et avant la séquence prend place.(c) ne pas utiliser un dérouleur segue, il suffit d'utiliser un bouton d'action. Dans la méthode d'action, vous pouvez vous détendre' en appelant
popToViewController
sur votre manette de navigation.Par ailleurs, si vous mettez en œuvre une barre d'outils sur le viewController (pas à l'aide de la manette de navigation de la barre d'outils), le résultat est le même: la transition est déclenchée en premier, de sorte que le bouton de action échoue.
Si vous êtes en mesure d'effectuer vous détendre Enchaîner avec Succès. Ensuite, la méthode de la destination-Vue-Contrôleur est appelé juste avant la séquence lieu, vous pouvez faire ce que vous voulez dans la source viewcontroller en utilisant la séquence de l'objet.
si vous voulez que votre logique dans la source ensuite, le Contrôleur de mettre en œuvre prepareForSegue en Scène B et le déroulement des enchaînements en Identifiant du Storyboard > Gauche de la Vue de la hiérarchie Panneau > sous la Sortie en Scène B.
Au premier abord, vous devez appeler l'envoi de données dans la méthode prepareForSegue.
Si vous ne voulez pas laisser se détendre segue arriver avant d'obtenir la réponse du serveur, vous devez remplacer
méthode et
return NO;
. Ensuite, vous pouvez effectuer des enchaînements manuellement lorsque vous obtenez la réponse du serveur en appelant le: