Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 找不到的协议声明_Iphone_Objective C_Ios_Delegates_Protocols - Fatal编程技术网

Iphone 找不到的协议声明

Iphone 找不到的协议声明,iphone,objective-c,ios,delegates,protocols,Iphone,Objective C,Ios,Delegates,Protocols,我有两个对象,都是视图控制器。第一个(我称之为viewController1)声明了一个协议。第二个(我将其命名为viewController2)符合此协议 XCode给了我一个生成错误:“找不到viewController1的协议声明” 我已经看到了关于这个主题的各种问题,我确信这与循环错误有关,但在我的例子中我看不到它 代码如下 viewController1.h @protocol viewController1Delegate; #import "viewController2.h"

我有两个对象,都是视图控制器。第一个(我称之为viewController1)声明了一个协议。第二个(我将其命名为viewController2)符合此协议

XCode给了我一个生成错误:“找不到viewController1的协议声明”

我已经看到了关于这个主题的各种问题,我确信这与循环错误有关,但在我的例子中我看不到它

代码如下

viewController1.h

@protocol viewController1Delegate;

#import "viewController2.h"

@interface viewController1 {

}

@end

@protocol viewController1Delegate <NSObject>

// Some methods

@end
#import "viewController1.h"

@interface viewController2 <viewController1Delegate> {

}

@end
@protocolviewcontroller1delegate;
#导入“viewController2.h”
@界面视图控制器1{
}
@结束
@协议视图控制器1网关
//一些方法
@结束
viewController2.h

@protocol viewController1Delegate;

#import "viewController2.h"

@interface viewController1 {

}

@end

@protocol viewController1Delegate <NSObject>

// Some methods

@end
#import "viewController1.h"

@interface viewController2 <viewController1Delegate> {

}

@end
#导入“viewController1.h”
@界面视图控制器2{
}
@结束
最初,我在viewController1中的导入行位于协议声明的导入行之上。这根本阻止了该项目的建设。在搜索了SO之后,我意识到了问题所在,并切换了两条线路。我现在得到一个警告(与错误相反)。该项目构建良好,实际上运行完美。但我仍然觉得一定有什么不对劲,应该给予警告

现在,据我所知,当编译器到达viewController1.h时,它看到的第一件事是协议的声明。然后导入viewController.h文件,并看到它实现了这个协议

如果它以另一种方式编译它们,它将首先查看viewController2.h,它要做的第一件事是导入viewController1.h,其中第一行是协议声明


我遗漏了什么吗?

viewController1.h
中删除这一行:

#import "viewController2.h"
问题在于
viewController2
的接口在协议声明之前被预处理

文件的一般结构应如下所示:

@protocol viewController1Delegate;
@class viewController2;

@interface viewController1
@end

@protocol viewController1Delegate <NSObject>
@end
@protocolviewcontroller1delegate;
@类viewController2;
@界面视图控制器1
@结束
@协议视图控制器1网关
@结束
A.h:
#输入“B.h”//A
@甲级;
@协议代表
(方法……)
@结束
@界面视图控制器:A
@属性(非原子,强)id preViewController_B;(A议定书)
@结束
B.h:
#导入“A.h”//A
@乙级;;
@协议代表
(方法……)
@结束
@界面视图控制器:B
@属性(非原子,强)id preViewController_A;(B议定书)
@结束
上午:
@接口A()
@结束
@实施A
(实施协议…)
结束
B.m:
@接口B()
@结束
@实施B
(实施协议…)
@结束

对于那些可能需要它的人:

也可以通过在ViewController2的实现文件(.m)中移动ViewController1.h的导入而不是头文件(.h)来修复此问题

像这样:

视图控制器1.h

#import ViewController2.h

@interface ViewController1 : UIViewController <ViewController2Delegate>
@end
ViewController2.m

#import ViewController2.h
#import ViewController1.h

@implementation ViewController2
@end

这将修复出现错误的情况,因为ViewController1.h是在协议声明之前导入ViewController2.h的。

我不能…(我应该说)…ViewController1确实需要能够呈现ViewController2。有
@class ViewController2指令。在
viewController1.m
中导入头文件。是否可以添加一些注释或详细信息?这将提高你答案的质量,更好地教育每个人。