Iphone 找不到的协议声明
我有两个对象,都是视图控制器。第一个(我称之为viewController1)声明了一个协议。第二个(我将其命名为viewController2)符合此协议 XCode给了我一个生成错误:“找不到viewController1的协议声明” 我已经看到了关于这个主题的各种问题,我确信这与循环错误有关,但在我的例子中我看不到它 代码如下 viewController1.hIphone 找不到的协议声明,iphone,objective-c,ios,delegates,protocols,Iphone,Objective C,Ios,Delegates,Protocols,我有两个对象,都是视图控制器。第一个(我称之为viewController1)声明了一个协议。第二个(我将其命名为viewController2)符合此协议 XCode给了我一个生成错误:“找不到viewController1的协议声明” 我已经看到了关于这个主题的各种问题,我确信这与循环错误有关,但在我的例子中我看不到它 代码如下 viewController1.h @protocol viewController1Delegate; #import "viewController2.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
中导入头文件。是否可以添加一些注释或详细信息?这将提高你答案的质量,更好地教育每个人。