在Xcode中找不到协议声明

23

今天在构建我的应用程序时,我遇到了一个问题。我在MyObject1中声明了一个协议,并在其中添加了一个委托属性。我将MyObject2分配为MyObject1的委托。我按照通常的方式添加它,如下所示:

@interface MyObject2 : UIViewController <DelegateOfObject1>

但是Xcode说无法找到我的协议声明。我检查了代码,但我确实声明了这个协议。我尝试将MyObject2分配为其他对象的委托。

我编辑了我的代码,像这样:

@interface MyObject2 : UIViewController <UITableViewDelegate,DelegateOfObject1>

但是Xcode再次说它找不到DelegateOfObject1的协议声明。我尝试删除我的代码中的DelegateOfObject1,然后将MyObject分配为其他对象的委托,如下所示:

@interface MyObject2 : UIViewController <UITableViewDelegate,UITabBarDelegate>

没有发现任何错误。然后我再次尝试将DelegateOfObject1重新添加到代码中:

@interface MyObject2 : UIViewController <UITableViewDelegate,UITabBarDelegate,DelegateOfObject1>

那时Xcode没有发现任何错误。因此,我再次尝试从代码中删除UITableViewDelegate和UITabBarDelegate:

@interface MyObject2 : UIViewController <DelegateOfObject1>

这时没有发现任何错误,但那是我之前编写的相同代码。这种问题可能是什么原因呢?

谢谢...


`@protocol DelegateOfObject1 <NSObject> @optional
  • (void)someThingHappensAt:(NSString *)onWhatStuff; @end`
- edie
就我个人而言,我曾经遇到过这个错误,但是它是由于在“框架搜索路径”中指定的某个文件夹中存在一个旧版本框架的副本所致。旧版本不包含相关协议,但是包含该文件夹排在搜索路径顺序的最前面。删除重复的框架即可解决此错误。 - stephent
请检查此解决方案 https://dev59.com/smw15IYBdhLWcg3wtd4g - Chandni - Systematix
5个回答

56

这个错误是由于导入循环引起的。


谢谢,这让我头疼了好久! - David K
21
导入循环是指两个或多个模块互相导入对方的情况。这会导致程序进入无限循环并最终崩溃。要解决此问题,可以通过重新组织代码以避免循环导入或将导入语句移动到函数或类中来延迟导入。 - Sam Spencer
Sam - 导入循环是指两个模块相互导入的情况。你不知道编译器会先处理哪一个。避免这种情况的一种方法是让其中一个将另一个声明为 @class。 - LevinsonTechnologies
尝试这个 https://dev59.com/smw15IYBdhLWcg3wtd4g - Chandni - Systematix

11

我已将协议声明放在单独的文件中,并在MyObject2中导入。


将您的@protocol定义从类中剪切出来。创建一个新的头文件(File > New > File... > Header File),粘贴@protocol定义,然后导入头文件即可。 - Jason Moore

4
错误可能在导入循环中。
我在两个类中都导入了“AppDelegate.h”。我从声明协议的类中删除了它,错误就消失了。 :)

2
抱歉,我没有理解您的请求。请提供需要翻译的内容。
#import "NameOfDelegate.h" 

在你的MyObject头文件的顶部?

我已经添加了必要的.h文件。 - edie

0

使用'@class MyObject;'以避免导入循环。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接