我有两个对象,都是视图控制器。第一个(我称之为viewController1)声明了一个协议。第二个(不出所料我将命名viewController2)符合这个协议。
XCode给我一个构建错误:'找不到viewController1的协议声明'
我已经看过关于这个主题的各种问题,我确信这是一个循环错误,但我只是在我的情况下看不到...
以下代码..
viewController1.h
@protocol viewController1Delegate;
#import "viewController2.h"
@interface viewController1 {
}
@end
@protocol viewController1Delegate <NSObject>
// Some methods
@end
viewController2.h
#import "viewController1.h"
@interface viewController2 <viewController1Delegate> {
}
@end
最初,我在viewController1中的导入行高于协议声明的导入行。这阻碍了项目的建设。在SO上搜索之后,我意识到了这个问题,然后切换了两条线。我现在收到警告(而不是错误)。该项目建设良好,实际上运行完美。但我仍然觉得必须有一些错误才能发出警告。
现在,据我所知,当编译器到达viewController1.h时,它首先看到的是协议的声明。然后它导入viewController.h文件并看到它实现了这个协议。
如果它反过来编译它们,它首先会查看viewController2.h,它首先要做的是导入viewController1.h,第一行是协议声明。
我错过了什么吗?
答案 0 :(得分:68)
从viewController1.h
#import "viewController2.h"
问题是viewController2
的接口在协议声明之前被预处理。
文件的一般结构应如下所示:
@protocol viewController1Delegate;
@class viewController2;
@interface viewController1
@end
@protocol viewController1Delegate <NSObject>
@end
答案 1 :(得分:1)
A.h:
#import "B.h" // A
@class A;
@protocol Delegate_A
(method....)
@end
@interface ViewController : A
@property(nonatomic,strong)id<ViewControllerDelegate> preViewController_B;(protocol A)
@end
B.h:
#import "A.h" // A
@class B;
@protocol Delegate_B
(method....)
@end
@interface ViewController : B
@property(nonatomic,strong)id<ViewControllerDelegate> preViewController_A;(protocol B)
@end
A.m:
@interface A ()<preViewController_B>
@end
@implementation A
(implement protocol....)
end
B.m:
@interface B ()<preViewController_A>
@end
@implementation B
(implement protocol....)
@end
答案 2 :(得分:1)
对于那些可能需要它的人:
还可以通过在 ViewController2 的实现文件(.m)中导入 ViewController1.h 而不是头文件(.h)来解决此问题。
像这样:
ViewController1.h
#import ViewController2.h
@interface ViewController1 : UIViewController <ViewController2Delegate>
@end
ViewController2.h
@protocol ViewController2Delegate;
@interface ViewController2
@end
ViewController2.m
#import ViewController2.h
#import ViewController1.h
@implementation ViewController2
@end
这将解决发生错误的情况,因为 ViewController1.h 是在协议声明之前在 ViewController2.h 中导入的。