2

我的班级 .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 的协议定义。执行此操作的正确方法是什么,为什么找不到?我需要在接口之前有协议的完整定义吗?谢谢!

4

4 回答 4

17

@protocol MyProtocol;例如,当您断言方法将id <MyProtocol>作为参数时,使用很有用。

当您声称您的类符合<MyProtocol>. 这样做的原因是编译器需要完整的协议声明,以验证您的类实际上符合协议。(这种编译时检查是使用正式协议而不是旧的非正式协议的一个重要原因。)

您可以通过两种方式进行修复。正如@skram 所建议的那样,一个是向前声明整个事情。这可行,但在我看来它也相当有限。在这种情况下,为什么要使用协议 - 只需将所有内容都放在课堂@interface上并完成它。

我更喜欢的第二种方法是实际上有一个单独的标题,例如MyProtocol.h. 然后,您可以根据需要自由地将其导入任何头文件或实现文件。这使您可以轻松地重用协议(并避免有时出现的循环导入问题)。

于 2012-06-18T22:17:13.310 回答
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
于 2012-06-18T22:11:22.133 回答
0

是的,超类和采用的协议定义需要在类定义之前定义(逐字或使用#import)。它们不能被提前声明。

于 2012-06-18T22:16:01.830 回答
-1

我总是在@interface 之前看到整个协议定义。我相信您也可以将其放入单独的文件中

于 2012-06-18T22:09:02.360 回答