2010-10-15 4 views
1

Je pensais à ce sujet et ai lu un autre stackoverflow question concernant la meilleure façon recommandée de communiquer entre les contrôleurs de vue. Cependant, la question/réponse pour cela ne semble pas aborder la meilleure approche pour le comportement inverse.Quelle est la meilleure façon d'inverser la communication entre les contrôleurs de vue?

dire pour transmettre des données de ParentController à son ModalController, nous pourrions initialiser ModalController comme initWithDataToProcess:. Mais si nous voulons faire le inverser? Comment avertirais-je le contrôleur précédent d'une nouvelle donnée?

par exemple. L'utilisateur clique sur le bouton 'nouvelle personne' sur le ParentController. J'initie un nouveau ModalController et présente l'utilisateur avec une vue d'éditeur de personne via presentModalViewController:. L'utilisateur clique sur 'fait' pour ajouter une nouvelle personne. I dismissModalViewController: et l'interface utilisateur revient à la vue ParentController. L'utilisation d'une référence de champ globale dans un objet singleton (délégué d'application ou autre) est mauvaise.

délégation (via le protocole formel) et notifications (via NSNotificationCenter) semble exagéré. Aucune suggestion?

+0

En .NET, ce n'est pas un problème car un appel modal ('ShowDialog()') est un appel bloquant. Cela ne semble pas être le cas avec Objective-c/Cocoa avec 'presentModalViewController:' – JeffreySadeli

Répondre

0

Un délégué est à peu près le minimum que vous pouvez faire. Si vous pensez que c'est trop compliqué de déclarer un nouveau protocole pour cela, il vous suffit de passer dans le contrôleur de la vue parente et de faire appel à la méthode modale.

+1

* COMMENT * faites-vous "passer" juste ... et "avez-vous appelé le modal"? (Pourquoi tant de gens répondent-ils aux questions avec "tu le fais ... juste en le faisant" ... au lieu de dire * COMMENT * tu le fais?) – Patricia

1

Il est généralement plus propre d'utiliser les notifications. Il suffit d'ajouter votre observateur comme ceci ....

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(somethingHappened:) name:@"MyNotification" object:nil]; 

et ailleurs dans votre code vous publierez la notification quand vous le souhaitez.

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyNotification" object:self]; 

Dans l'exemple je passe moi, mais vous pouvez passer un objet que vous voulez vraiment et il sera alimenté à votre somethingHappened: fonction

L'important est de garder le @ « MyNotification » très descriptif et unique. L'ajout de votre nom de projet au début est un bon moyen de garder les choses uniques ... par exemple. @ "ProjAXViewHasGotData"

Questions connexes