2012-10-15 11 views
6

Ich habe benutzerdefinierte UIView Klasse GestureView. Ich habe eine Forward-Deklaration für diese Klasse und es ist Delegierter unten. Ich habe GestureView.h in die .m-Datei importiert. Das funktioniert einwandfrei, aber iOS gibt eine Warnmeldung mit dem Hinweis "Protokolldefinition für GestureViewDelegate nicht finden" aus. Wenn ich die Vorwärtsdeklaration entferne, gibt es dieselbe Warnmeldung wie der Fehler. Ich möchte GestureView.h nicht von ContainerViewController.h importieren, da ich normalerweise Inhalte in der .m-Datei importiere. Könnte jemand bitte erklären, was in der Klassenstruktur falsch ist?iOS 5.0 Warnung: Kann keine Protokolldefinition für Delegat finden

ContainerViewController.h

#import <UIKit/UIKit.h> 

@class DividerView; 
@class GestureView; 
@protocol GestureViewDelegate; 

@interface ContainerViewController : UIViewController<GestureViewDelegate> 
    @property (strong, nonatomic) IBOutlet GestureView *topContentView; 
@end 

GestureView.h

#import <UIKit/UIKit.h> 

@protocol GestureViewDelegate; 

@interface GestureView : UIView 
    - (void)initialiseGestures:(id)delegate; 
@end 

@protocol GestureViewDelegate <NSObject> 
@required 
- (void)GestureView:(GestureView*)view handleSignleTap:(UITapGestureRecognizer*)recognizer; 
@end 
+0

Wo ist Ihr Protokoll definiert? – Moxy

+0

Sie können in dem Code, den ich gepostet habe, sehen! Es ist in GestureView.h! – applefreak

+0

In 'ContainerViewController.h' versuche' #import GestureView.h' anstelle der Forward-Deklaration – Moxy

Antwort

21

Ich mag, dass Sie versuchen, die Einfuhr in die Header-Dateien zu vermeiden: sehr gute Praxis. Um Ihren Fehler zu beheben, können Sie Ihren Code jedoch noch besser machen! Meiner Meinung nach ist es nicht wirklich notwendig, dass Ihre ContainerViewController Klasse äußerlich erklärt, dass es Protokoll unterstützt, also sollten Sie dies in Ihre Implementierungsdatei verschieben. Wie so:

GestureView.h

#import <UIKit/UIKit.h> 


@protocol GestureViewDelegate; 

@interface GestureView : UIView 

- (void)initialiseGestures:(id <GestureViewDelegate>)delegate; 

@end 


@protocol GestureViewDelegate <NSObject> 
@required 

- (void)gestureView:(GestureView *)view handleSingleTap:(UITapGestureRecognizer *)recognizer; 

@end 

ContainerViewController.h

#import <UIKit/UIKit.h> 


@class GestureView; 

@interface CollectionViewController : UIViewController 

// this property is declared as readonly because external classes don't need to modify the value (I guessed seen as it was an IBOutlet) 
@property (strong, nonatomic, readonly) GestureView *topContentView; 

@end 

ContainerViewController.m

#import "ContainerViewController.h" 
#import "GestureView.h" 


// this private interface declares that GestureViewDelegate is supported 
@interface CollectionViewController() <GestureViewDelegate> 

// the view is redeclared in the implementation file as readwrite and IBOutlet 
@property (strong, nonatomic) IBOutlet GestureView *topContentView; 

@end 


@implementation ContainerViewController 

// your implementation code goes here 

@end 
+0

Super Neal! Ich habe Ihre Lösung verstanden und es macht für mich durchaus Sinn, aber ich frage mich, wie andere Protokolle wie UITableView-Delegate und Datasource implementiert wurden? Sie können sie in der Deklaration der Headerdatei selbst implementieren! Können wir unsere benutzerdefinierten Protokolle nicht so erstellen, dass Sie bei der Implementierung @ required-Methoden überschreiben müssen? Wenn wir sie nicht umsetzen, brauchen wir überhaupt keine Protokolle zu haben. Ich kann die Protokoll-Delegate-Variable einfach aus dem ContainerViewController entfernen und die ID in initializeGestures übergeben. – applefreak

+0

Darüber hinaus sollte iOS-Compiler in diesem Fall überhaupt keine Warnmeldung geben. Die Forward-Deklarationen sollen Warnungen und Fehler beim Kompilieren vermeiden! Sind sie nicht? – applefreak

+0

Während dies funktioniert, ist es klarer, die unterstützten Delegierten an einer Stelle zu speichern - die Header-Datei, in der alle Standarddelegaten aufgelistet sind. ZB in meiner '.h' Datei könnte ich' 'haben, im Idealfall möchte ich ALLE Delegierten dorthin setzen. Wie wird das gemacht? –

0

auf diese Weise versuchen, und Sie antworten, wenn es funktioniert oder nicht.

GestureView.h

#import <UIKit/UIKit.h> 

@protocol GestureViewDelegate <NSObject> 
@required 
- (void)GestureView:(GestureView*)view handleSignleTap:(UITapGestureRecognizer*)recognizer; 
@end 

@interface GestureView : UIView 
    - (void)initialiseGestures:(id)delegate; 
@end 

ContainerView.h

#import <UIKit/UIKit.h> 

@class DividerView; 
@class GestureView; 
/*@protocol GestureViewDelegate;*/ //NO NEED TO WRITE THIS 

@interface ContainerViewController : UIViewController<GestureViewDelegate> 
    @property (strong, nonatomic) IBOutlet GestureView *topContentView; 
@end 
+0

Nein, es funktioniert nicht. Das habe ich schon probiert. Es gibt dieselbe Warnmeldung wie ERROR! – applefreak