找不到协议声明
我有两个view controllers A
和B
,他们都有他们的代表。
当我什么也没做,除了在头文件的开头定义协议, #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的导入。然后,我可以把导入协议顺序回到原来的样子。