找不到协议声明

我有两个view controllers AB ,他们都有他们的代表。

当我什么也没做,除了在头文件的开头定义协议, #import另一个头文件,我得到了两个错误 –

无法find协议声明“BDelegate”,这是显示在啊(我写)无法find协议声明“ADelegate”,这是显示在Bh(我写了)

在网上看,人们之前写道,头文件的通告包含可能导致问题。 他们推荐使用#include代替,或者像@

 @class A 

代替

 #import Ah 

里面#import Bh

我已经尝试了几乎所有这些导入的组合, @classes#include但仍然无法摆脱警告。 此外,在线解决schemebuild议将#import移动到.m文件,但这也没有帮助。 部分原因是,网上的解决scheme有点模糊 – 如果你能把它分解,那就太好了。

有什么build议可以做什么来解决这个问题?


– BigViewController.h –

 #import "BaseViewController.h" #include "BaseViewController.h" @class BigViewController; @protocol BigViewControllerDelegate -(void) BigViewController:(BigViewController *) bigView; @end @interface BigViewController : UIViewController <BaseViewControllerDelegate> { //delegate id <BigViewControllerDelegate> delegate; ivars... } @properties... @end -------------------------------------------------- 

– BaseViewController.h –

 #<UIKit/UIKit.h> #import "BigViewController.h" #include "BigViewController.h" @class BigViewController; @protocol BaseViewControllerDelegate - (void) setParametersWithItemChosen:(Item *) item; @end @interface BaseViewController : UIViewController <...BigViewControllerDelegate...> { ivars... //delegate id <BaseViewControllerDelegate> delegate; } @properties... @end 

让我进一步减less样本,并标记行:

VC1.h

 #import "VC2.h" // A @class VC1; @protocol VC1Delegate // B @end @interface VC1 : UIViewController <VC2Delegate> // C @end 

VC2.h

 #import "VC1.h" // D @class VC2; @protocol VC2Delegate // E @end @interface VC2 : UIViewController <VC1Delegate> // F @end 

考虑一下#imports VC1.h发生什么事情:它到达A行,然后处理导入。 行D不做任何事情,因为VC1.h已经被导入。 然后行E被处理。 然后F行,我们得到一个错误,因为我们还没有到B线,所以协议没有宣布!

考虑一下#imports VC2.h发生了什么事情:到达D行,然后处理导入。 A行不做任何事情,因为VC2.h已经被导入。 然后处理B行。 然后行C,我们得到一个错误,因为我们还没有得到行E,所以协议没有宣布!

第一步是重新考虑这两个类是否真的需要成为对方的代表。 如果你能打破这个循环,那可能就是要走的路。 如果没有,你需要重构你的头文件。 最直接的方法可能是将代表放入自己的标题中:

VC1Delegate.h

 @class VC1; @protocol VC1Delegate // B @end 

VC1.h

 #import "VC1Delegate.h" #import "VC2Delegate.h" @interface VC1 : UIViewController <VC2Delegate> // C @end 

VC2Delegate.h

 @class VC2; @protocol VC2Delegate // E @end 

VC2.h

 #import "VC1Delegate.h" #import "VC2Delegate.h" @interface VC2 : UIViewController <VC1Delegate> // F @end 

如果您现在跟踪导入,您将会看到在@interface行尝试使用它们之前,现在总是会声明相应的协议。

在#import行上面写协议声明代码

@协议 – – –

@结束

import—-

@interface classname —

我有几乎相同的问题,我已经解决了上面的答案,但方式稍有不同。

我所做的只是将#import行放在头文件中的协议声明之后 。 希望我能帮上忙。 如果有人知道这是不好的编程,请让我知道

我发现了另一个解决这个问题的方法,因为我不太喜欢在类和协议声明之间只有一些#imports的想法。

基本上你只要将.h类文件中的<YourProtocolName>移动到.m文件中的类扩展名

所以在你的.m文件中添加

 @interface YourClassName () <YourProtocolName> @end 

我不知道这是否是一个很好的做法,但它看起来像一个更清洁的解决scheme,以避免import周期。

尝试将<BaseViewControllerDelegate>或<BigViewControllerDelegate>放在实现文件中,而不是头文件中。 它会工作。

我跟着在导入之前移动协议的修复,它解决了问题…导入包括委托,所以这是造成这个问题。

但后来我想,为什么我要导入委托呢? 我没有引用它的属性,也没有直接调用它的任何方法(这是协议声明的目的)。

我试着评论委托的导入,看到错误出现的地方,发现我在导入委托的时候导入的是一个委托正在导入的声明,也就是我正在导入A(也是我的委托)A是导入B,我实际上使用的是B.所以我留下了A的导入注释,并添加了B的导入。然后,我可以把导入协议顺序回到原来的样子。