首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >找不到协议声明

找不到协议声明
EN

Stack Overflow用户
提问于 2011-06-23 07:04:18
回答 6查看 58.6K关注 0票数 64

我有两个view controllers AB,它们彼此都有自己的代理。

当我除了在头文件的开头定义协议和#import对方的头文件之外什么也不做时,我得到了两个关于以下内容的错误:

找不到"BDelegate“的协议声明,它显示在A.h (我写的地方)找不到"ADelegate”的协议声明,它显示在B.h (我写的地方)

在网上看一看,人们早些时候写道,头文件的循环包含可能导致了问题。他们建议使用#include,或者像这样的@class声明-

代码语言:javascript
复制
@class A

而不是

代码语言:javascript
复制
#import A.h

#import B.h内幕

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

有什么建议可以解决这个问题吗?

-- BigViewController.h --

代码语言:javascript
复制
#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 --

代码语言:javascript
复制
#<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
EN

回答 6

Stack Overflow用户

发布于 2011-06-23 07:49:23

让我进一步减少样本,并标记这些行:

VC1.h

代码语言:javascript
复制
#import "VC2.h"  // A

@class VC1;

@protocol VC1Delegate // B
@end

@interface VC1 : UIViewController <VC2Delegate> // C
@end

VC2.h

代码语言:javascript
复制
#import "VC1.h"  // D

@class VC2;

@protocol VC2Delegate // E
@end

@interface VC2 : UIViewController <VC1Delegate> // F
@end

考虑一下当某件东西导入VC1.h时会发生什么:它到达A行,然后导入被处理。行D不执行任何操作,因为已经导入了VC1.h。然后处理E行。然后是F行,我们得到一个错误,因为我们还没有到达B行,所以协议没有声明!

然后考虑一下,当某件东西导入VC2.h时会发生什么:它到达D行,然后导入被处理。线路A不执行任何操作,因为已经导入了VC2.h。然后处理行B。然后是C行,我们得到一个错误,因为我们还没有到达E行,所以协议没有声明!

第一步是重新考虑这两个类是否真的需要成为对方的代理。如果你能打破这个循环,那可能就是你要走的路。如果不是,您将需要重新构造您的头。最直接的方法可能是将委托放入它们自己的头中:

VC1Delegate.h

代码语言:javascript
复制
@class VC1;

@protocol VC1Delegate // B
@end

VC1.h

代码语言:javascript
复制
#import "VC1Delegate.h"
#import "VC2Delegate.h"

@interface VC1 : UIViewController <VC2Delegate> // C
@end

VC2Delegate.h

代码语言:javascript
复制
@class VC2;

@protocol VC2Delegate // E
@end

VC2.h

代码语言:javascript
复制
#import "VC1Delegate.h"
#import "VC2Delegate.h"

@interface VC2 : UIViewController <VC1Delegate> // F
@end

如果您现在跟踪导入,您将看到在@interface行尝试使用它们之前,将始终声明适当的协议。

票数 105
EN

Stack Overflow用户

发布于 2013-01-22 14:23:17

在#import行上编写协议声明代码,例如

@协议

@end

导入

@interface类名称

票数 102
EN

Stack Overflow用户

发布于 2012-04-11 19:25:05

我遇到了几乎相同的问题,多亏了上面的答案,我解决了它,但方式略有不同。

我所做的就是将#行放在头文件中的协议声明之后。希望我能帮上忙。如果有人因为某些原因知道这是糟糕的编程,请让我知道

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6447573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档