Невозможно найти декларацию протокола для

У меня есть два объекта, оба из которых являются контроллерами представлений. Первый (вызов называет его 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 перед объявлением протокола.