2009-06-10 3 views
22

Ich versuche, NSImageView zu erweitern, damit ich die Drag/Drop-Verantwortung an den Controller delegieren kann. Alles funktioniert gut mit dem einen Problem, dass der Compiler jetzt Warnungen zum Senden von Nachrichten an Objekte mit Typ-ID anzeigt. Um das zu lösen, nahm ich an, dass ich einfach den Typ des Ivars mit dem Namen des Protokolls suffixieren müsste. Dies schlägt jedoch kläglich mit der Nachricht fehl, dass es die Definition für das Protokoll nicht finden kann.Definieren und Verwenden von Protokollen in objective-c

#import <Cocoa/Cocoa.h> 


@interface DragDropImageView : NSImageView { 
    id <DragDropImageViewDelegate> _delegate; 
} 

@property (readwrite, retain) id <DragDropImageViewDelegate> delegate; 

@end 

@protocol DragDropImageViewDelegate 

@optional 

- (NSDragOperation)dragDropImageView:(DragDropImageView *)ddiv validateDrop:(id  <NSDraggingInfo>)info; 
- (BOOL)dragDropImageView:(DragDropImageView *)ddiv acceptDrop:(id <NSDraggingInfo>)info; 
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender; 

@end 

Irgendwelche Hinweise, wo ich vielleicht falsch liege? Ich bin mir sicher, dass es etwas Einfaches sein muss, aber ich bin ziemlich neu in Obj-c.

+0

+1 für nette Frage. –

+0

Die Schlüsselwörter lauten: _forward declaration_. – holex

Antwort

31

Sie sind auf dem richtigen Weg, aber Sie werden durch den C-Compiler aufgehängt, der ein wenig archaisch ist. Der Compiler erstickt, weil die Definition des Protokolls zum Zeitpunkt der Verwendung nicht verfügbar ist. @protocol DragDropImageViewDelegate muss definiert werden, bevor Sie id< DragDropImageViewDelegate> als einen Typ verwenden können. Sie können die @protocol Definition vor der Verwendung (das heißt vor Ihrer @interface) bewegen, oder eine

@protocol DragDropImageViewDelegate; 

vor der @interface hinzufügen (eine Vorwärtsdeklaration) und die @protocol Erklärung verlassen, wo es ist.

+0

Schön. Vielen Dank. Ich musste tatsächlich für die Forward-Deklaration gehen, da das Verschieben der Protokolldeklaration über die @implementation das Problem des Protokolls eingeführt hat, das sich jetzt auf DragDropImageView bezieht, bevor es definiert wurde. Danke für Ihre Hilfe! – Tricky

+0

Ja, natürlich würde es. Im Allgemeinen ist die Forward-Deklaration die Lösung für zirkuläre Abhängigkeiten dieses Typs. –

+0

+1 für Nizza Antwort. Ich habe eine kleine Abfrage, wenn wir schreiben \ @protocol DragDropImageViewDelegate; vor \ @interface, was macht dann der Compiler? –

10

Als allgemeine Regel gilt, ich das Protokoll zuerst definieren, mit vorangestellten

@class DragDropImageView; 

Aber Sie können mit der Rückwärts- und vorausgehen tun:

@protocol DragDropImageViewDelegate; 

Meiner Meinung nach ist das Protokoll eine wichtige Teil der Erklärung, und neigt dazu, ziemlich kurz zu sein, so bevorzuge ich es, zuerst zu gehen, anstatt am Ende der Header-Datei verloren zu sein, aber es ist eine Frage des Geschmacks.

Verwandte Themen