2014-12-08 80 views
2

我在.h文件中声明的enum如下:枚举的委托方法声明

typedef enum { 
    item1 = 0, 
    item2, 
    item3 
} myEnum; 

我想在一个视图控制器使用它在一个委托方法签名如下:

@protocol myClassDelegate <NSObject> 
- (void)myDelegateMethod:(enum myEnum)type; 
@end 

我在这个视图控制器类中包含了.h文件。

创建上述协议时,自动完成不会提示枚举,编译器也会抱怨。

它可以正常使用int而不是签名中的枚举。但是,我想知道是否有/使用枚举的方式,或者如果我做错了什么。

我已经经历了很多帖子,但都是正常的方法。

编辑:

ViewControllerA.h

#import <UIKit/UIKit.h> 
#import "ViewControllerB.h" 

typedef enum { 
    item1 = 0, 
    item2, 
    item3 
} myEnum; 

@interface ViewControllerA : UIViewController <myClassDelegate> 

@end 

ViewControllerB.h

#import <UIKit/UIKit.h> 
#import "ViewControllerA.h" 

@protocol myClassDelegate <NSObject> 
- (void)myDelegateMethod:(enum myEnum)type; // Autocomplete does not suggest the enums 
              // Also, x-code gives warning: Declaration of 'enum myEnum' will not be visible outside of this functio 
@end 

@interface ViewControllerB : UITableViewController 
@property (nonatomic, strong) id<myClassDelegate> delegate; 
@end 
+0

将'(enum myEnum)type'更改为'(myEnum)type'适用于我。 – gabbler 2014-12-08 09:38:51

+0

已经尝试过,没有工作。你是否使用它来进行委托方法声明? – kRiZ 2014-12-08 09:44:07

+0

对不起,我没有将它用于委托方法,稍后会尝试。 – gabbler 2014-12-08 09:45:06

回答

2

你有一个圆形头部依赖性(ViewControllerA.h进口ViewControllerB.h反之亦然)。

移动enum声明到一个共同的头文件,并导入无论它的需要:

CommonTypes.h:

typedef enum { 
    item1, 
    item2, 
    item3 
} MyEnum; 

ViewControllerA.h:

#import <UIKit/UIKit.h> 
#import "ViewControllerB.h" 

@interface ViewControllerA : UIViewController <myClassDelegate> 
// I assume there is a reference to ViewControllerB here somewhere? 
@end 

ViewControllerB.h:

#import <UIKit/UIKit.h> 
#import "CommonTypes.h" 

@protocol myClassDelegate <NSObject> 
- (void)myDelegateMethod:(MyEnum)type; 
@end 

@interface ViewControllerB : UITableViewController 
@property (nonatomic, strong) id<myClassDelegate> delegate; 
@end 
+1

虽然这可能“解决”了问题,但我不认为将与该类明确关联的枚举(假设是这种情况)分隔为“常见类型”头是个好主意。这是一种解决方法,而不是解决方法。 - 如果循环依赖是问题,请使用前向类声明。 – KerrM 2014-12-08 11:13:27

+0

@KerrM从这个问题来看,并不清楚'enum'与视图控制器有多么紧密的关联。如果它不是* app global *,那么头文件名应该使用更具体的名称。然而,我不可能知道这种或那种方式。 – Droppy 2014-12-08 11:15:13

+0

枚举与视图控制器类 – kRiZ 2014-12-08 20:24:58

1

Here是一个演示您的视图控制器结构,它为我工作的例子。

+0

相关不是一个现实的答案,因为问题与头文件中的循环依赖关系有关;避免头文件完全避免了这个问题。 – Droppy 2014-12-08 11:26:31

+0

我听说Xcode可以解决头文件和项目中的循环依赖项,我在'ViewControllerB'的实现文件中执行'#import“ViewControllerA.h”'。 – gabbler 2014-12-08 11:30:23

+0

它不会使用前向类/协议声明(即'@class SomeOtherClass;')。你不能通过'#import'来完成。 – Droppy 2014-12-08 11:32:16