Obtenga #define de tipo UIColor de NSString

He definido las siguientes constantes, cada una de las cuales representa una 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] 

Pregunta

¿Cómo puedo usar un NSString como @"purple" , @"blue" o @"magenta" para get la constante "X_COLOR_DARK" o "X_COLOR_LIGHT"? ¿Es posible hacerlo directamente?

Ejemplo

Esto está mal, pero debería proporcionar una image más clara de lo que estoy preguntando. En este ejemplo, tengo la cadena @"blue" y quiero derivar los valores de color BLUE_COLOR_DARK y BLUE_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 

Seguir

Tenga en count que UIColor no es necesariamente relevante para responder la pregunta, aunque ayuda a mi situación. Más específicamente, me pregunto si una cadena que coincida con un nombre definido (por ejemplo, @"PURPLE_COLOR_DARK" y #define PURPLE_COLOR_DARK ) se puede interpretar como el nombre definido en lugar de utilizar directamente el nombre definido.

Anda los #defines. Y use una categoría UIColor y NSSelectorFromString como se describe en esta respuesta .

O bien, cree un NSDictionary donde las keys son los nombres de sus colors y los objects son sus colors. A continuación, puede get UIColor por nombre.

P.ej:

 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]; 

no puede usar los nombres #defined directamente porque esos nombres no existen en el código comstackdo. Durante la compilation, el preprocesador replaceá todas las apariciones de PURPLE_COLOR_DARK con [UIColor ...]

Puedes crear la categoría de UIColor.

UIColor + CustomColors.h

 + (UIColor *)networkingFill; 

UIColor + CustomColors.m

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

Ahora usa esta categoría en tu class:

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

Entender la categoría