2009-03-14 4 views
0

Ich fange an zu denken, dass meine Cocoa-Anwendung nicht wirklich nach den Prinzipien von MVC ausgeführt wird. Mein Problem ist folgendes:Zugriff auf den Controller in einer Cocoa-Anwendung

Ich habe einige Klassen in meinem Projekt, eines der Copier.h genannt und ein anderes DropReciever.h genannt. Copier ist eine Art meiner Hauptansicht Controller, wie es alle Bindungen und Hauptmethoden hat. DropReciever ist eine benutzerdefinierte Implementierung einer NSView, die es der App ermöglicht, Dateien per Drag & Drop zu akzeptieren.

Gibt es jetzt eine einfache Möglichkeit, Nachrichten an Copier von DropReceiver zu senden? Im Moment kennen sich die beiden nicht, und ich kann mir keinen eleganten Weg vorstellen, sie zu verbinden, da sie beide getrennt voneinander instanziiert sind. Wie kann ich sie dazu bringen, sich zu sehen? Oder gibt es eine elegante, Coca-ische Art, das besser zu machen?

(Wenn Sie an meinem Quellcode aussehen wollen, es ist here.)

Antwort

1

So wie ich es normalerweise tun ist DropReceiver in der Spitze zu instanziiert und dann eine IBOutlet DropReceiver * zu Ihrem Copier.h hinzufügen, dann ein Ziehen Verbindung von der Copier-Instanz zu Ihrem DropReceiver im Fenster

+0

genial. Vielen Dank! – winsmith

+0

Ich sehe, dass dies als die "richtige" Antwort gewählt wurde, aber es klingt wie Winsmith eigentlich will Nachrichten in die andere Richtung senden - von der Ansicht auf den Controller. Dies bedeutet, dass für die Ansicht ein 'Kopierer *' - Verweis erforderlich ist und die Verbindung umgekehrt hergestellt werden muss. – erikprice

+0

Es wäre ziemlich einfach, die Verbindung rückgängig zu machen, oder, sobald die Verbindung hergestellt wird, eine Art Delegatending zu machen – cobbal

2

Eine andere Möglichkeit wäre, eine Eigenschaft des Drop-Empfängers als eine Bindung verfügbar zu machen und den Kopierer (programmatisch) an ihn zu binden. Setzen Sie dann in der Drop-Methode den Drop-Empfänger auf den abgelegten Inhalt als den Wert dieser Eigenschaft (der Sie etwa droppedObject nennen würden).

Wenn Sie die Eigenschaft, die Magie der Bindungen wird die gebundene Eigenschaft des Kopierers einstellen. Der Kopierer kann dort in seiner Setter-Methode entsprechend reagieren.

2

Ich hätte eine Delegate-Eigenschaft auf dem DropReceiver. Was auch immer dafür verantwortlich ist, diese Dinge zusammen zu binden, würde den Delegierten bestimmen. Das Delegat-Objekt kann eine ID sein, oder Sie können ein Protokoll dafür erstellen (beide Idiome sind in Cocoa üblich). Ich mache das überall. Sie erhalten die Trennung, die Sie brauchen, ohne zu viel in den Häusern arbeiten zu müssen.

Der einzige Nachteil, wenn Sie den Delegaten bei der Initialisierung nicht einstellen, ist, dass alle Ihre Anrufe durch if(delegate) Schecks geschützt werden müssen.

+0

Dieser Ansatz wird detaillierter beschrieben, einschließlich der Behandlung der Responder-Kette auf Matt Gallaghers Blog: http://cocoaithllove.com/2008/07/better-integration-for-ntsviewcontroller.html – erikprice

Verwandte Themen