由于我最近有一个导入周期,我将所有#import
语句(关于我自己的文件)从标题移动到相应的.m
文件中。我还添加了@class
和@protocol
前向声明来缓和编译器。但是,我仍然听到他的警告:
Cannot find the protocol definition for 'MyCustomDelegate'.
正如我所说,在@protocol MyCustomDelegate
- Block中使用它之前有一个@interface
。有趣的是,只有在另一个文件(其标题在.m
- 文件中导入)中声明了相应的委托时,才会出现此警告。
我读到一个解决方案是在单独的头文件中声明委托,并直接在实现委托的类的头中导入该文件。这真的是要走的路吗?还有其他解决方案吗?我认为那些代表已经充分夸大了我们的代码,现在我应该继续甚至为它声明一个自己的文件?
小样本代码可以更好地说明问题:
NewFooController.h
#import <UIKit/UIKit.h>
@protocol NewFooControllerDelegate;
@interface NewFooController : UITableViewController
@property (nonatomic, weak) id<NewFooControllerDelegate> delegate;
@end
@protocol NewFooControllerDelegate
@end
HomeTableViewController.h
#import <UIKit/UIKit.h>
@protocol NewFooControllerDelegate;
// warning points to line below
@interface HomeTableViewController : UITableViewController <NewFooControllerDelegate>
@end
HomeTableViewController.m
#import "HomeTableViewController.h"
#import "NewFooController.h"
@implementation HomeTableViewController
@end
答案 0 :(得分:-1)
HomeTableViewController.h引用协议,但尚未声明。 如果在HomeTableViewController.h中尝试使用它之前导入NewTaskController.h,它应该可以解决您的问题。
当然,您可以从HomeTableViewController.m
中删除导入答案 1 :(得分:-1)
不确定这是否是“最佳方式”,但尝试在类头文件之前实现协议的类的导入头。
HomeTableViewController.m
#import "NewFooController.h"
#import "HomeTableViewController.h"
@implementation HomeTableViewController
@end
您可以删除HomeTableViewController.h中的协议声明
#import <UIKit/UIKit.h>
@interface HomeTableViewController : UITableViewController <NewFooControllerDelegate>
@end