繁体   English   中英

从NSString获取UIColor类型的#define

[英]Get #define of type UIColor from NSString

我定义了以下常量,每个常量代表一个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]

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

这是错误的,但应该更清楚地了解我的要求。 在这个例子中,我有字符串@"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"#define PURPLE_COLOR_DARK )是否可以解释为定义的名称,而不是直接使用定义的名称。

放弃#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名称,因为这些名称在编译的代码中不存在。 在编译期间,预处理器将用[UIColor ...]替换所有出现的PURPLE_COLOR_DARK

您可以创建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];

理解类别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM