27

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

XCode 给我一个构建错误:“找不到 viewController1 的协议声明”

我已经看到有关此主题的各种问题,并且我确定它与循环错误有关,但在我的情况下我看不到它......

下面的代码..

viewController1.h

@protocol viewController1Delegate;

#import "viewController2.h"

@interface viewController1 {

}

@end

@protocol viewController1Delegate <NSObject>

// Some methods

@end

视图控制器2.h

#import "viewController1.h"

@interface viewController2 <viewController1Delegate> {

}

@end

最初,我在 viewController1 中的导入行位于协议声明的上方。这完全阻止了该项目的建设。在SO上搜索后,我意识到了问题,并把两条线调换了。我现在收到警告(而不是错误)。该项目构建良好,实际上运行完美。但我还是觉得一定有什么不对的地方要警告。

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

如果它以相反的方式编译它们,它会首先查看 viewController2.h,然后它会做的第一件事是导入 viewController1.h,其中第一行是协议声明。

我错过了什么吗?

4

3 回答 3

68

删除此行viewController1.h

#import "viewController2.h"

问题是viewController2' 的接口在协议声明之前进行了预处理。

文件的一般结构应该是这样的:

@protocol viewController1Delegate;
@class viewController2;

@interface viewController1
@end

@protocol viewController1Delegate <NSObject>
@end
于 2012-04-15T09:36:01.080 回答
1

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

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

像这样:

ViewController1.h

#import ViewController2.h

@interface ViewController1 : UIViewController <ViewController2Delegate>
@end

ViewController2.h

@protocol ViewController2Delegate;

@interface ViewController2
@end

视图控制器2.m

#import ViewController2.h
#import ViewController1.h

@implementation ViewController2
@end

这将解决发生错误的情况,因为ViewController1.h在协议声明之前被导入到ViewController2.h中。

于 2017-06-27T16:17:44.947 回答
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
于 2016-07-15T03:05:48.133 回答