Objective-C:循环协议要求

时间:2011-08-15 13:36:03

标签: objective-c

我有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

如何克服这个问题?

2 个答案:

答案 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文件中吗?