找不到协议声明

时间:2012-04-15 09:25:30

标签: iphone objective-c ios delegates protocols

我有两个对象,都是视图控制器。第一个(我称之为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,第一行是协议声明。

我错过了什么吗?

3 个答案:

答案 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 中导入的。