我有一个充满NSStrings的数组,我需要使用NSString来更改属性文本的颜色。我把原来的NSString分成了一个包含单个NSString颜色的数组,但我被困在这里。数组中的字符串是[UIColor orangecolor]。 我试过这个,但它返回null。
SEL blackSel = NSSelectorFromString(@"blackColor");
UIColor* tColor = nil;
if ([UIColor respondsToSelector: blackSel])
tColor = [UIColor performSelector:blackSel];
答案 0 :(得分:9)
我写了一个自定义NSValueTransformer
,允许我将NSColor
翻译成NSString
(并返回)以存储到NSUserDefaults
,因为我不喜欢存储的颜色使用字节数组,这是默认行为。如果您在IB中设置自定义变换器,它也适用于KVO。您当然可以在代码中调用静态方法来执行转换。
为UIColor
:
StringColourTransformer.h:
#import <Cocoa/Cocoa.h>
@interface StringColourTransformer : NSValueTransformer
+ (NSString *)toString:(NSColor *)value;
+ (NSColor *)fromString:(NSString *)value;
@end
StringColourTransformer.m:
#import "StringColourTransformer.h"
@implementation StringColourTransformer
+ (NSString *)toString:(NSColor *)value
{
StringColourTransformer *transformer = [[StringColourTransformer alloc] init];
NSString *str = [transformer reverseTransformedValue:value];
return str;
}
+ (NSColor *)fromString:(NSString *)value
{
StringColourTransformer *transformer = [[StringColourTransformer alloc] init];
NSColor *color = (NSColor *)[transformer transformedValue:value];
return color;
}
+ (Class)transformedValueClass
{
return [NSString class];
}
+ (BOOL)allowReverseTransformation
{
return YES;
}
- (id)transformedValue:(id)value
{
CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0;
// Only NSString classes are reverse-transformed
if ([value isKindOfClass:[NSString class]])
{
NSString *stringValue = (NSString *)value;
sscanf([stringValue UTF8String],
#ifdef __x86_64
"%lf %lf %lf %lf",
#else
"%f %f %f %f",
#endif
&r, &g, &b, &a);
}
return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a];
}
- (id)reverseTransformedValue:(id)value
{
CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0;
// Only NSColor classes are transformed
if ([value isKindOfClass:[NSColor class]])
{
NSColor *colourValue = (NSColor *)value;
NSColor *converted = [colourValue colorUsingColorSpaceName:@"NSCalibratedRGBColorSpace"];
[converted getRed:&r green:&g blue:&b alpha:&a];
}
return [NSString stringWithFormat:@"%.3f %.3f %.3f %.3f", r, g, b, a];
}
@end
答案 1 :(得分:4)
使用此方法,会将colorname
转换为对象UIColor
-(UIColor *)giveColorfromStringColor:(NSString *)colorname
{
SEL labelColor = NSSelectorFromString(colorname);
UIColor *color = [UIColor performSelector:labelColor];
return color;
}
答案 2 :(得分:1)
根据@ trojanfoe的优秀答案,我制作了一个基于类别的解决方案,我用它来动态配置来自Info.plist文件的UIViewControllers(当你有许多应用程序共享一个公共代码库时会有帮助):
的UIColor + STRING.H:
#import <UIKit/UIKit.h>
@interface UIColor (String)
+(UIColor*) colorFromString:(NSString*) string;
@end
的UIColor + String.m:
#import "UIColor+String.h"
@implementation UIColor (String)
/**
c.f. http://stackoverflow.com/a/17121747/153422
*/
+(UIColor *)colorFromString:(NSString *)stringValue
{
CGFloat r = 0.0, g = 0.0, b = 0.0, a = 1.0;
sscanf([stringValue UTF8String],
#ifdef __x86_64
"%lf %lf %lf %lf",
#else
"%f %f %f %f",
#endif
&r, &g, &b, &a);
return [UIColor colorWithRed:r green:g blue:b alpha:a];
}
@end
用法示例:
NSString* colourString = [[NSBundle mainBundle].infoDictionary valueForKeyPath:@"Theme.Colours.NavigationBar.Title"];
lTitle.textColor = [UIColor colorFromString:colourString];
(这假设您编辑了Info.plist并添加了一个带有子句“Colors”的Dict“Theme”,带有一个子句“NavigationBar”,带有NSString“Title”,其值为例如“1 0 0 1”(红色))
答案 3 :(得分:1)
你可以简单地使用这种格式@“1 0.96 0.75 1”的字符串,其中值为红色,绿色,蓝色和alpha。然后使用CIColor将它们转换为UIColor!
这是一个例子:
NSString *spinnerColorStr = @"1 0.96 0.75 1";
CIColor *spinnerCi = [CIColor colorWithString:spinnerColorStr];
UIColor *spinnerColor = [UIColor colorWithRed:spinnerCi.red green:spinnerCi.green blue:spinnerCi.blue alpha:spinnerCi.alpha];
答案 4 :(得分:0)
[查找下面的编辑]
我会使用查找表。在这种情况下,一个字典将把可能的值保存为键,将值保存为UIColor对象。如:
NSDictionary *colorTable = @{
@"blackColor" : [UIColor blackColor],
@"greenColor" : [UIColor greenColor],
@"redColor" : [UIColor redColor]
};
这样,当您想要“转换”颜色字符串时,您会:
UIColor *myConvertedColor = [colorTable objectWithKey:@"blackColor"];
myConvertedColor将是一个UIColorBlack。
希望这有帮助! 祝你好运!
<强> ---&GT;&gt;编辑&LT;&LT; ---- 强>
好的,这是经过测试的代码。在干净的地方试一试,这样你就不会受到可能正在运行的其他东西的干扰。请注意,我认为iOS ..否则为NSColor更改UIColor ..
NSDictionary *colorTable = @{
@"blackColor" : [UIColor blackColor],
@"greenColor" : [UIColor greenColor],
@"redColor" : [UIColor redColor]
};
UIColor *myConvertedColorNull = [colorTable objectForKey:@"whiteColor"]; //NULL
UIColor *myConvertedColor = [colorTable objectForKey:@"blackColor"]; //NOT NULL
NSLog(@"MyColor: %@", [myConvertedColor description]);
NSLog(@"MyColorNULL: %@", [myConvertedColorNull description]);
这会产生此输出:
MyColor:UIDeviceWhiteColorSpace 0 1 MyColorNULL :( null)
正如您所看到的,MyColorNULL将证明您不应该如何进行搜索,而另一个则证明我的代码可以正常工作。
如果有帮助,请将我的回答标记为正确。如果它不让我们继续努力。