在ios应用程序中的单例中设置枚举,以便可以在整个应用程序中访问它

时间:2013-02-16 20:16:53

标签: ios enums singleton global-variables

我想在iOS应用中的Constants Singleton类中设置我的全局常量值,以便导入常量的任何类都可以使用这些值。

然而,在用这个想法玩了几个小时之后,我仍然无法让它发挥作用。

在我的Constants.m文件中

 @interface Constants()
 {
    @private
    int _NumBackgroundNetworkTasks;
    NSDateFormatter *_formatter;
 }
 @end

 @implementation Constants

 static Constants *constantSingleton = nil;
 //Categories of entries
 typedef enum
 {
   mapViewAccessoryButton = 999

  } UIBUTTON_TAG;


 +(id)getSingleton
 {

   .....
  }

我有另一个类MapViewController,其中我引用了Constants单例,我试图访问这样的枚举

 myDetailButton.tag =  self.constSingleton.UIBUTTON_TAG.mapViewAccessoryButton;

但是,这不起作用。我无法访问mapviewcontroller中的UIBUTTON_TAG

有人有什么建议吗?

由于

2 个答案:

答案 0 :(得分:3)

如果您想在整个应用程序中使用枚举,请将枚举定义放在.h文件中,而不是.m文件中。

<强>更新

Objective-C不支持名称空间,它不支持类级别常量或枚举。

该行:

myDetailButton.tag =  self.constSingleton.UIBUTTON_TAG.mapViewAccessoryButton;

应该是:

myDetailButton.tag =  mapViewAccessoryButton;

假设您在某个.h文件中定义UIBUTTON_TAG枚举。

编译Objective-C应用程序时,所有枚举的所有值都必须具有唯一的名称。这是Objetive-C基于C的结果。

更新2

有一种方法可以获得你想要的东西而不是枚举。这样的事情应该有效:

Constants.h:

@interface UIBUTTON_TAG_ENUM : NSObject

@property (nonatomic, readonly) int mapViewAccessoryButton;
// define any other "enum values" as additional properties

@end

@interface Constants : NSObject

@property (nonatomic, readonly) UIBUTTON_TAG_ENUM *UIBUTTON_TAG;

+ (id)getSingleton;

// anything else you want in Constants

@end

Constants.m

@implementation UIBUTTON_TAG_ENUM

- (int)mapViewAccessoryButton {
    return 999;
}

@end

@implementation Constants {
    int _NumBackgroundNetworkTasks;
    NSDateFormatter *_formatter;
    UIBUTTON_TAG_ENUM *_uiButtonTag;
}

@synthesize UIBUTTON_TAG = _uiButtonTag;

- (id)init {
    self = [super init];
    if (self) {
        _uiButtonTag = [[UIBUTTON_TAG_ENUM alloc] init];
    }

    return self;
}

// all of your other code for Constants

@end

现在你可以做到:

myDetailButton.tag =  self.constSingleton.UIBUTTON_TAG.mapViewAccessoryButton;

我不确定这是否有意义。

答案 1 :(得分:1)

如果您不打算更改枚举,只需将其粘贴在预编译的头文件(.pch)中即可。