我的班级.h看起来像:
@protocol AppInfoDelegate;
@class InfoTextView;
@interface AppInfoViewController : UIViewController <AppInfoDelegate> {
}
@property (nonatomic, retain) NSArray *textObjectsArray;
@property (nonatomic, retain) InfoTextView *itView;
@property (nonatomic, retain) UIButton *pgBackButton;
@property (nonatomic, retain) UIButton *pgFwdButton;
@end
@protocol AppInfoDelegate <NSObject>
- (void)closeButtonPressed:(id)sender;
@end
我收到一条警告,指出无法找到AppInfoDelegate的协议定义。这样做的正确方法是什么,为什么不能找到它?我是否需要在接口之前获得协议的完整定义?谢谢!
答案 0 :(得分:15)
在断言时,使用@protocol MyProtocol;
非常有用,例如,方法将id <MyProtocol>
作为参数。
当您声称您的班级符合<MyProtocol>
时, 非常有用。原因是编译器需要完整的协议声明才能验证您的类实际是否符合协议。 (这种编译时检查是使用正式协议而不是旧的非正式协议的一个重要原因。)
您可以通过两种方式修复。正如@skram所暗示的那样,只是向前宣告整个事情。这有效,但在我看来它也相当有限。在这种情况下,为什么还要使用协议 - 只需将所有内容放在课程@interface
中即可完成。
我更喜欢的第二种方法是实际上有一个单独的标题,例如MyProtocol.h
。然后,您可以根据需要随意将其导入任何标头或实现文件。这使您可以轻松地重用协议(并避免有时会出现循环导入的麻烦)。
答案 1 :(得分:0)
试试这个:
@protocol AppInfoDelegate <NSObject>
- (void)closeButtonPressed:(id)sender;
@end
@class InfoTextView;
@interface AppInfoViewController : UIViewController <AppInfoDelegate> {
}
@property (nonatomic, retain) NSArray *textObjectsArray;
@property (nonatomic, retain) InfoTextView *itView;
@property (nonatomic, retain) UIButton *pgBackButton;
@property (nonatomic, retain) UIButton *pgFwdButton;
@end
答案 2 :(得分:0)
是的,需要在类定义之前定义超类和采用的协议定义(逐字或使用#import)。他们无法向前宣布。
答案 3 :(得分:-1)
我总是在@interface之前看到整个协议定义。我相信你也可以把它放到一个单独的文件中