Objective c iOS 5.0警告:找不到代理的协议定义

Objective c iOS 5.0警告:找不到代理的协议定义,objective-c,ios5,protocols,forward-declaration,Objective C,Ios5,Protocols,Forward Declaration,我有自定义UIView类GestureView。我有一个关于这个类的转发声明,它是下面的委托。我已将GestureView.h导入.m文件。这可以正常工作,但iOS会发出警告消息说“找不到GestureViewDelegate的协议定义”。若我删除转发声明,它将给出与错误相同的警告消息。我不想从ContainerViewController.h导入GestureView.h,因为我通常在.m文件中导入内容。有人能解释一下下面的课堂结构有什么问题吗 ContainerViewController.

我有自定义UIView类GestureView。我有一个关于这个类的转发声明,它是下面的委托。我已将GestureView.h导入.m文件。这可以正常工作,但iOS会发出警告消息说“找不到GestureViewDelegate的协议定义”。若我删除转发声明,它将给出与错误相同的警告消息。我不想从ContainerViewController.h导入GestureView.h,因为我通常在.m文件中导入内容。有人能解释一下下面的课堂结构有什么问题吗

ContainerViewController.h

#import <UIKit/UIKit.h>

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

@interface ContainerViewController : UIViewController<GestureViewDelegate>
   @property (strong, nonatomic) IBOutlet GestureView *topContentView;
@end
#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
#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
#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:UIViewController
@属性(强,非原子)IBOutlet GestureView*topContentView;
@结束
GestureView.h

#import <UIKit/UIKit.h>

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

@interface ContainerViewController : UIViewController<GestureViewDelegate>
   @property (strong, nonatomic) IBOutlet GestureView *topContentView;
@end
#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
#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
#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
#导入
@协议手势视图代表;
@界面手势视图:UIView
-(无效)初始签名:(id)代表;
@结束
@协议手势视图代理
@必需的
-(void)GestureView:(GestureView*)view handleSignleTap:(UITapGestureRecognitor*)识别器;
@结束

试试这种方法,如果有效,请回复

手势视图

#import <UIKit/UIKit.h>

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

@interface GestureView : UIView
    - (void)initialiseGestures:(id)delegate;
@end
#导入
@协议手势视图代理
@必需的
-(void)GestureView:(GestureView*)view handleSignleTap:(UITapGestureRecognitor*)识别器;
@结束
@界面手势视图:UIView
-(无效)初始签名:(id)代表;
@结束
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
#导入
@类别划分视图;
@类手势视图;
/*@协议GestureViewDelegate;*///没必要写这个
@接口ContainerViewController:UIViewController
@属性(强,非原子)IBOutlet GestureView*topContentView;
@结束

我喜欢您试图避免在头文件中导入:非常好的做法。然而,为了修复你的bug,你可以把你的代码做得更好!在我看来,您的
ContainerViewController
类实际上没有必要对外声明它支持
GestureViewDelegate
协议,因此您应该将其移动到实现文件中。像这样:

GestureView.h

#import <UIKit/UIKit.h>

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

@interface ContainerViewController : UIViewController<GestureViewDelegate>
   @property (strong, nonatomic) IBOutlet GestureView *topContentView;
@end
#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
#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
#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
#导入
@协议手势视图代表;
@界面手势视图:UIView
-(无效)初始签名:(id)代表;
@结束
@协议手势视图代理
@必需的
-(void)gestureView:(gestureView*)视图句柄singletap:(UITapGestureRecognizer*)识别器;
@结束
ContainerViewController.h

#import <UIKit/UIKit.h>

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

@interface ContainerViewController : UIViewController<GestureViewDelegate>
   @property (strong, nonatomic) IBOutlet GestureView *topContentView;
@end
#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
#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
#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
#导入
@类手势视图;
@接口集合ViewController:UIViewController
//该属性声明为只读,因为外部类不需要修改该值(我猜它是一个IBOutlet)
@属性(强、非原子、只读)GestureView*topContentView;
@结束
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
#导入“ContainerViewController.h”
#导入“GestureView.h”
//此专用接口声明支持GestureViewDelegate
@接口集合ViewController()
//该视图在实现文件中重新声明为readwrite和IBOutlet
@属性(强,非原子)IBOutlet GestureView*topContentView;
@结束
@ContainerViewController的实现
//您的实现代码在这里
@结束

您的协议定义在哪里?您可以在我发布的代码中看到!在手势视图中。h!在
ContainerViewController.h
中,尝试导入手势视图.h而不是前向声明我提到我不想这样做!如果你知道远期申报有什么问题,请告诉我。谢谢,不行,不行。我已经试过了。它会给出与错误相同的警告信息!尼尔真棒!我理解您的解决方案,它对我来说完全有意义,但我想知道其他协议(如UITableView委托和数据源)是如何实现的?您可以在头文件声明本身中实现它们!我们是否可以创建自定义协议,以便在实现它时,必须重写@required方法?如果我们不实现它们,那么就没有任何协议的意义。我可以简单地从ContainerViewController中完全删除协议委托变量,并在InitialisePictures中传递它的id。此外,在这种情况下,iOS编译器不应该给出任何警告消息。转发声明旨在避免编译时警告和错误!不是吗?虽然这样做有效,但更清楚的是将受支持的代理列在一个位置—列出所有标准代理的头文件中。例如,在我的
.h
文件中,我可能有
,理想情况下,我希望将所有学员都放在那里。如何做到这一点?@TRedman在这种情况下,我的建议是在一个单独的头文件中声明
GestureViewDelegate
(例如
GestureViewDelegate.h
),该文件可以导入到实现头文件中(而类本身可以向前声明)。谢谢你,我今天早上就有这个想法。