我有两个目的,这两者都是视图控制器。 第一(III族称之为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进口线。 这是防止项目从全面建设。 因此搜索后,我意识到这个问题,并围绕切换两行。 现在我得到一个警告(而不是错误)。 该项目建立精细和实际运行完美。 但我还是觉得一定有什么不对的,给予警告。
现在,据我所看到的,当编译器到达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
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
对于那些谁可能需要它:
它也可以通过移动ViewController1.h的ViewController2的实现文件(.M)进口来解决这个头文件(.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协议宣布前进口这将修复的情况。