【问题标题】:Enums in delegate method declaration委托方法声明中的枚举
【发布时间】:2014-12-08 09:33:23
【问题描述】:

我在.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

【问题讨论】:

  • 将 (enum myEnum)type 更改为 (myEnum)type 对我有用。
  • 已经试过了,没用。您是否将其用于委托方法声明?
  • 对不起,我没有用它作为委托方法,稍后会尝试。
  • 是的,我的问题在于代表。否则对我来说也很好。不过还是谢谢。
  • 我只是在委托方法中做了同样的事情,编译器没有抱怨。

标签: ios objective-c enums delegates


【解决方案1】:

您有一个循环标头依赖项(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

【讨论】:

  • 虽然这可能“解决”问题,但我不认为将与该类有明确关联的枚举(假设是这种情况)分离为“常见类型”标题是一个好的主意。这是一种解决方法,而不是修复方法。 -- 如果循环依赖是问题,使用前向类声明。
  • @KerrM 好吧,从问题中并不清楚enum 与视图控制器的关联程度。如果它不是 app global 则应为头文件名使用更具体的名称。但是,我不可能知道一种或另一种方式。
  • 枚举与视图控制器类有关
【解决方案2】:

Here 是一个演示视图控制器结构的示例,它对我有用。

【讨论】:

  • 不是一个现实的答案,因为问题在于头文件中的循环依赖;完全避免头文件只是避免了这个问题。
  • 听说Xcode可以解决头文件和项目中的循环依赖,我在ViewControllerB的实现文件中做#import "ViewControllerA.h"。
  • 除非您使用前向类/协议声明(即@class SomeOtherClass;),否则它不会。你不能通过#import来做到这一点。
  • 没错,在我的情况下是不同的,我不需要在ViewControllerB.h中引用ViewControllerA。
  • 所以你同意根本原因是循环头依赖?
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多