2009-03-14 6 views
0

Я начинаю думать, что мое приложение Cocoa на самом деле не сделано в соответствии с принципами MVC. Моя проблема заключается в следующем:Доступ к контроллеру в приложении Cocoa

У меня есть несколько классов в моем проекте, один из которых называется Copier.h, а другой - DropReciever.h. Copier - это мой главный контроллер представления, так как он имеет все привязки и основные методы. DropReciever - это обычная реализация NSView, позволяющая приложению принимать файлы с помощью перетаскивания.

Теперь, есть ли простой способ для отправки сообщений Copier от DropReceiver? Прямо сейчас, двое не знают друг друга, и я не могу придумать элегантный способ их подключения, так как они оба созданы отдельно. Как я могу заставить их видеть друг друга? Или, есть ли элегантный, Coca-ish способ сделать это лучше?

(Если вы хотите посмотреть на мой исходный код, это here.)

ответ

1

Как я обычно делаю это, чтобы создать экземпляр DropReceiver в бобах, а затем добавить к вашему IBOutlet DropReceiver * Copier.h, а затем перетащить соединение с экземпляром Copier с вашим DropReceiver в окне

+0

awesome. Благодаря! – winsmith

+0

Я вижу, что это было признано «правильным» ответом, но похоже, что winsmith действительно хочет отправлять сообщения в другом направлении - от представления до контроллера. Это означает, что для представления потребуется ссылка 'Copier * ', и соединение нужно будет сделать обратным. – erikprice

+0

Было бы довольно легко отменить соединение или, как только соединение будет сделано, сделать что-то вроде делегирования – cobbal

2

Другим способом было бы выставить свойство приемника капли в качестве привязки и связать с ним копир (программно). Затем, в методе drop, у получателя пересылки задано выпавшее содержимое как значение этого свойства (которое вы назовете примерно как droppedObject).

Когда вы установите свойство, магия Bindings установит связанное свойство вашего копира. Копир может соответствующим образом отреагировать в своем методе настройки.

2

У меня было бы свойство делегата на DropReceiver. Все, что несет ответственность за привязку этих вещей, будет определять делегат. Объект делегата может быть идентификатором, или вы можете создать для него протокол (оба идиомы распространены в Cocoa). Я делаю это повсюду. Вы получаете необходимое разделение, без необходимости слишком много работать над домами.

Единственный недостаток, если вы не устанавливаете делегирование делегата, заключается в том, что все ваши обращения к нему должны быть защищены if(delegate) чеками.

+0

Этот подход описан более подробно, включая обработку цепочек ответчиков, на блоге Мэтта Галлахера: http: /cocoawithlove.com/2008/07/better-integration-for-nsviewcontroller.html – erikprice

Смежные вопросы