我有2个视图控制器,一个对象选择器和一个对象编辑器。这两个对象都有自己的协议,允许演示者接收数据和数据。解雇他们。
编辑器有时需要提供一个选择器,选择器有时需要允许对象进行编辑。
问题在于存在循环协议依赖性,并且由于对象必须符合协议,因此声明转发不起作用(您仍然会收到编译器警告)。
我不只是声明需要符合它的ivar,整个选择器/编辑器类需要符合,因此标头需要有关协议的完整信息。
我收到Cannot find protocol definition for 'EditorDelegate'
错误。
以下是一个例子:
Picker.h
#import "Editor.h"
@protocol PickerDelegate;
@interface Picker : UIViewController <EditorDelegate> {
id <PickerDelegate> delegate;
}
@protocol PickerDelegate <NSObject>
- (void)picker:(Picker *) wasDismissedWithObject:(id)object;
@end
Editor.h
#import "Picker.h"
@protocol EditorDelegate;
@interface Editor : UIViewController <PickerDelegate> {
id <EditorDelegate> delegate;
}
@protocol EditorDelegate <NSObject>
- (void)editor:(Editor *) dismissedAfterEditingObject:(id)object;
@end
如何克服这个问题?
答案 0 :(得分:5)
相同的文件解决方案:
@protocol classBProtocol;
@protocol classAProtocol <NSObject>
-(void)fooA:(id<classBProtocol>)classB;
@end
#import "classB.h"
@interface classA : NSObject
@property (nonatomic) id<classBProtocol> delegate;
@end
和
@protocol classAProtocol;
@protocol classBProtocol <NSObject>
-(void)fooB:(id<classAProtocol>)classA;
@end
#import "classA.h"
@interface classB : NSObject
@property (nonatomic) id<classAProtocol> delegate;
@end
这里的技巧是在协议声明后导入标题。
答案 1 :(得分:4)
您无法在单独的文件中定义协议,并将它们导入.m文件中吗?