2012-04-15 3 views
25

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

Я что-то упустил?

ответ

67

Удалить эту строку из viewController1.h:

#import "viewController2.h" 

Проблема заключается в том, что интерфейс viewController2 «s предобработан до объявления протокола.

Общая структура файла должно быть таким:

@protocol viewController1Delegate; 
@class viewController2; 

@interface viewController1 
@end 

@protocol viewController1Delegate <NSObject> 
@end 
+1

Я не могу ... (я должен был сказать) ... viewController1 должен быть в состоянии представить viewController2. –

+2

Существует директива '@class viewController2;' для этого. Импортируйте файл заголовка в 'viewController1.m'. – Costique

+1

Я обновил ответ, чтобы проиллюстрировать суть. – Costique

1
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 
+0

Можете вдавить комментарии или подробную информацию? Это улучшит качество вашего ответа и улучшит образование всех. – NonCreature0714

1

Для тех, кто может понадобиться:

Это также можно исправить путем перемещения импорт ViewController1. h в файле ViewController2 (.m) вместо файла заголовка (.h).

Как так:

ViewController1.h

#import ViewController2.h 

@interface ViewController1 : UIViewController <ViewController2Delegate> 
@end 

ViewController2.h

@protocol ViewController2Delegate; 

@interface ViewController2 
@end 

ViewController2.м

#import ViewController2.h 
#import ViewController1.h 

@implementation ViewController2 
@end 

Это исправит случай, когда ошибка происходит потому, что ViewController1.h импортируется в ViewController2.h до объявления протокола.

Смежные вопросы