2009-03-14 8 views
0

Je commence à penser que mon application Cocoa n'est pas vraiment faite selon les principes du MVC. Mon problème est le suivant:Accéder au contrôleur dans une application Cocoa

J'ai quelques classes dans mon projet, un de appelé Copier.h et un autre appelé DropReciever.h. Copier est en quelque sorte mon contrôleur de vue principal, car il a toutes les liaisons et les méthodes principales. DropReciever est une implémentation personnalisée d'un NSView pour permettre à l'application d'accepter les fichiers par glisser-déposer.

Maintenant, existe-t-il un moyen facile d'envoyer des messages à Copier de DropReceiver? En ce moment, les deux ne se connaissent pas, et je ne peux pas penser à une manière élégante de les relier, puisqu'ils sont tous les deux un peu instanciés séparément. Comment puis-je les faire se voir? Ou, y a-t-il une façon élégante et cocaïne de faire mieux?

(Si vous voulez regarder mon code source, il est here.)

Répondre

1

La façon dont je le fais habituellement est d'instancier DropReceiver dans la pointe, puis ajoutez un IBOutlet DropReceiver * à votre Copier.h, puis faites glisser une connexion de l'instance Copier à votre DropReceiver dans la fenêtre

+0

impressionnant. Merci! – winsmith

+0

Je vois que cela a été voté comme la réponse "correcte", mais il semble que winsmith veut réellement envoyer des messages dans l'autre sens - de la vue au contrôleur. Cela signifie que la vue aurait besoin d'une référence 'Copier *' et que la connexion devrait être faite à l'envers. – erikprice

+0

Il serait assez facile d'inverser la connexion, ou, une fois la connexion établie, de faire quelque chose de délégué – cobbal

2

Une autre méthode consiste à exposer une propriété du récepteur de dépôt en tant que liaison et à lier le copieur (par programmation). Ensuite, dans la méthode drop, demandez au récepteur de dépôt de définir le contenu déposé comme la valeur de cette propriété (que vous nommerez quelque chose comme droppedObject). Lorsque vous définissez la propriété, la magie des liaisons définit la propriété liée de votre copieur.

Le copieur peut réagir de manière appropriée dans sa méthode de réglage.

2

J'aurais une propriété de délégué sur le DropReceiver. Tout ce qui est responsable de lier ces choses ensemble serait le délégué. L'objet délégué peut être un identifiant, ou vous pouvez créer un protocole pour celui-ci (les deux idiomes sont communs dans Cocoa). Je fais ça partout. Vous obtenez la séparation dont vous avez besoin, sans avoir à trop travailler autour des maisons. Le seul inconvénient, si vous ne définissez pas le délégué à l'initialisation, est que tous vos appels doivent être protégés par if(delegate) chèques.

+0

Cette approche est décrite plus en détail, y compris la gestion de la chaîne répondeur, sur le blog de Matt Gallagher: http://cocoawithlove.com/2008/07/better-integration-for-nsviewcontroller.html – erikprice

Questions connexes