0

Je pensais que la réponse à cette question pourrait être très facile à trouver, mais en fait ce n'est pas le cas. Il s'agit essentiellement d'une meilleure pratique dans MVC mais j'ai besoin d'une réponse plus spécifique à l'implémentation de MVC par Cocoa. Supposons que vous ayez un MainView qui affiche des données à partir d'un tableau mutable via Bindings et l'option d'ajouter un nouvel élément à ce tableau. Maintenant, les données ajoutées au tableau peuvent être plus complexes et peuvent même nécessiter une validation avant de pouvoir être ajoutées au tableau ou un objet de ma classe de données peut être créé. J'ai donc ajouté un nouveau MVC ou une paire VC plus spécifique à mon projet qui est une vue où toutes les données peuvent être saisies et un bouton pour l'enregistrer. Une action de clic sur le bouton de sauvegarde provoquera le démarrage de la validation et devrait ensuite, éventuellement, ajouter les données au tableau si la validation a réussi.Communication entre différents ViewControllers dans Cocoa

Je me demande quelle est la meilleure solution pour accéder au tableau depuis AddViewController. Un tableau mutable partagé? Définir une propriété dans AddViewController?

Pour quelqu'un qui est habitué à MVC, la réponse peut être assez facile. De plus, je suis capable d'accéder au tableau mais je veux vraiment savoir quelle est la meilleure façon de le faire.

+0

double possible de [Passer des données entre les contrôleurs de vue] (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – Rob

Répondre

1

Delegate concept est la réponse à tous vos problèmes!

Une fois la validation des données réussit transmettre les données à votre contrôleur MainView à ajouter au tableau :)

Détail: Votre AddViewController devrait avoir un protocole, et déléguer la propriété

@protocol AddViewControllerDelegate <NSObject> 

-(void)addViewController:(AddViewController*)addViewController didCompleteWith:(id)data; 

@end 

@interface AddViewController : SuperClass 

@property (nonatomic,weak)id<AddViewControllerDelegate>delegate; 
... 

@end 

Votre principale Le contrôleur de vue doit implémenter ce protocole et le définir comme délégué AddViewController.

Lors de la validation des données, AddViewController doit appeler la méthode définie par le protocole sur le délégué.

-(void)dataValid:(id)data { 
... 
[self.delegate addViewController:self didCompleteWith:data] 
... 
} 
+1

+1 Convenu. Mais je pourrais suggérer (a) que le «délégué» devrait être une propriété «faible»; et (b) au lieu du nom de méthode 'addData', je pourrais envisager de le modéliser après' ABNewPersonViewControllerDelegate' et appeler cette méthode 'didCompleteWithNewXxx' (où" 'Xxx'" est le type d'objet ajouté) et, évidemment, une classe plus significative et les noms de protocole, par exemple 'AddXxxViewController' et' AddXxxViewControllerDelegate'. – Rob

+0

Bien noté, mon mauvais sur la propriété. J'ai également aimé vos suggestions de nom de méthode :) –

+0

J'approuve également les conventions de nommage @Rob suggérées. Je suis totalement en train d'avoir des noms propres et un bon code structuré. Merci de votre aide! – florianrogner

Questions connexes