3

我定义了以下常量,每一个都代表一个 UIColor:

// Purple
#define PURPLE_COLOR_DARK  [UIColor colorWithRed: 0.42 green: 0.25 blue: 0.60 alpha: 1.0]
#define PURPLE_COLOR_LIGHT [UIColor colorWithRed: 0.78 green: 0.47 blue: 0.72 alpha: 1.0]

// Blue
#define BLUE_COLOR_DARK  [UIColor colorWithRed: 0.00 green: 0.46 blue: 0.70 alpha: 1.0]
#define BLUE_COLOR_LIGHT [UIColor colorWithRed: 0.00 green: 0.75 blue: 0.88 alpha: 1.0]

// Magenta
#define MAGENTA_COLOR_DARK  [UIColor colorWithRed: 0.75 green: 0.00 blue: 0.28 alpha: 1.0]
#define MAGENTA_COLOR_LIGHT [UIColor colorWithRed: 1.00 green: 0.32 blue: 0.61 alpha: 1.0]

问题

如何使用NSStringlike@"purple"或获取相关的“X_COLOR_DARK”或“X_COLOR_LIGHT”常量@"blue"@"magenta"甚至可以直接这样做吗?

例子

这是错误的,但应该更清楚地说明我的要求。在这个例子中,我有字符串@"blue"并且想要导出BLUE_COLOR_DARKBLUE_COLOR_LIGHT颜色值。

NSString *color = @"blue";
UIColor *darkColor = (UIColor *)[[NSString stringWithFormat: @"%@_COLOR_DARK", color] uppercaseString];

// Debugging    
NSLog(@"%@", darkColor); // BLUE_COLOR_DARK
NSLog(@"%hhd", [lightColor isKindOfClass: [UIColor class]]);  // 0
NSLog(@"%hhd", [lightColor isKindOfClass: [NSString class]]); // 1

跟进

请注意, UIColor 不一定与回答问题相关,尽管它确实对我的情况有所帮助。更具体地说,我在询问是否可以将与定义的名称(例如@"PURPLE_COLOR_DARK"and #define PURPLE_COLOR_DARK)匹配的字符串解释为定义的名称,而不是直接使用定义的名称。

4

2 回答 2

4

抛弃#defines。并使用此答案中概述的UIColor类别等。NSSelectorFromString

或者,创建一个NSDictionary键是颜色的名称,对象是您的颜色。然后,您可以UIColor按名称获取。

例如:

NSDictionary *colors = @{ @"purple_dark"  : PURPLE_COLOR_DARK,
                          @"purple_light" : PURPLE_COLOR_LIGHT };

NSString *colorName = @"purple";

NSString *lightColorName = [colorName stringByAppendingString:@"_light"];
NSString *darkColorName = [colorName stringByAppendingString:@"_dark"];

UIColor *lightColor = colors[lightColorName];
UIColor *darkColor = colors[darkColorName];

您不能直接使用#defined 名称,因为这些名称在编译的代码中不存在。在编译期间,预处理器将替换所有出现的PURPLE_COLOR_DARKwith[UIColor ...]

于 2013-09-07T07:53:49.487 回答
3

您可以创建 UIColor 的类别。

UIColor+CustomColors.h

+ (UIColor *)redFill;

UIColor+CustomColors.m

+ (UIColor *)redFill
{
    return [UIColor colorWithRed:240.0 / 255.0 green:36.0 / 255.0 blue:0.0 / 255.0 alpha:1.0];
}

现在在你的课堂上使用这个类别:

NSArray *color = @[[UIColor redFill], ...etc];

了解类别

于 2013-09-07T04:06:21.890 回答