Цель-C: Требования к Циркулярному протоколу - PullRequest
2 голосов
/ 15 августа 2011

У меня есть 2 контроллера вида, средство выбора объектов и редактор объектов.Оба этих объекта имеют свои собственные протоколы, позволяющие докладчикам получать данные и отклонять их.

Редактору иногда требуется представить средство выбора, а средство выбора иногда должно разрешать редактирование объектов.

Проблема в том, что существует циклическая зависимость от протокола, и поскольку объекты должны соответствовать протоколам, переадресация объявлений не работает (вы по-прежнему получаете предупреждения компилятора).

Я не просто объявляю ивару, который должен соответствовать ему, весь класс выбора / редактора должен соответствовать, поэтому заголовкам нужна полная информация о протоколах.

Я получаю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 ]

5 голосов
/ 15 апреля 2013

Решение для тех же файлов:

@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

Хитрость в том, чтобы импортировать заголовки после объявления протокола.

4 голосов
/ 15 августа 2011

Не можете ли вы определить протоколы в отдельных файлах и импортировать их в файлы .m?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...