Невозможно найти декларацию протокола для
У меня есть два объекта, оба из которых являются контроллерами представлений. Первый (вызов называет его viewController1) объявляет протокол. Второй (что неудивительно, что я назову viewController2) соответствует этому протоколу.
XCode дает мне ошибку сборки: "Не удается найти объявление протокола для viewController1"
Я видел различные вопросы по этому вопросу, и я уверен, что это связано с ошибкой цикла, но я просто не вижу этого в моем случае...
Код ниже..
viewController1.h
@protocol viewController1Delegate;
#import "viewController2.h"
@interface viewController1 {
}
@end
@protocol viewController1Delegate <NSObject>
// Some methods
@end
viewController2.h
#import "viewController1.h"
@interface viewController2 <viewController1Delegate> {
}
@end
Изначально у меня была строка импорта в viewController1 выше строки объявления протокола. Это препятствовало строительству проекта вообще. После поиска на SO я понял проблему и переключил две линии вокруг. Теперь я получаю предупреждение (в отличие от ошибки). Проект строит отлично и фактически отлично работает. Но я все еще чувствую, что должно быть что-то неправильно, чтобы получить предупреждение.
Теперь, насколько я вижу, когда компилятор получает viewController1.h, первое, что он видит, это объявление протокола. Затем он импортирует файл viewController.h и видит, что он реализует этот протокол.
Если бы они компилировали их по-другому, сначала он посмотрел бы на viewController2.h, и первое, что он сделал бы, это import viewController1.h, первая строка которого является объявлением протокола.
Я что-то пропустил?
Ответы
Ответ 1
Удалите эту строку из viewController1.h
:
#import "viewController2.h"
Проблема заключается в том, что интерфейс viewController2
предварительно обрабатывается перед объявлением протокола.
Общая структура файла должна быть такой:
@protocol viewController1Delegate;
@class viewController2;
@interface viewController1
@end
@protocol viewController1Delegate <NSObject>
@end
Ответ 2
A.h:
#import "B.h" // A
@class A;
@protocol Delegate_A
(method....)
@end
@interface ViewController : A
@property(nonatomic,strong)id<ViewControllerDelegate> preViewController_B;(protocol A)
@end
B.h:
#import "A.h" // A
@class B;
@protocol Delegate_B
(method....)
@end
@interface ViewController : B
@property(nonatomic,strong)id<ViewControllerDelegate> preViewController_A;(protocol B)
@end
A.m:
@interface A ()<preViewController_B>
@end
@implementation A
(implement protocol....)
end
B.m:
@interface B ()<preViewController_A>
@end
@implementation B
(implement protocol....)
@end
Ответ 3
Для тех, кому это может понадобиться:
Также можно исправить это, перемещая импорт ViewController1.h в файл реализации ViewController2 (.m) вместо файла заголовка (.h).
Так же:
ViewController1.h
#import ViewController2.h
@interface ViewController1 : UIViewController <ViewController2Delegate>
@end
ViewController2.h
@protocol ViewController2Delegate;
@interface ViewController2
@end
ViewController2.m
#import ViewController2.h
#import ViewController1.h
@implementation ViewController2
@end
Это зафиксирует случай, когда ошибка возникает, поскольку ViewController1.h импортируется в ViewController2.h перед объявлением протокола.