我有一个充满NSString的数组,我需要使用NSString来改变属性文本的颜色。我把原始的NSString分离成一个数组包含单个带有颜色的NSString但是我卡在这里了。数组中的字符串是[UIColor orangecolor]。我已经试过了,但是它返回null。
SEL blackSel = NSSelectorFromString(@"blackColor");
UIColor* tColor = nil;
if ([UIColor respondsToSelector: blackSel])
tColor = [UIColor performSelector:blackSel];
我编写了一个自定义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
使用此方法,将colorname
转换为对象UIColor
-(UIColor *)giveColorfromStringColor:(NSString *)colorname
{
SEL labelColor = NSSelectorFromString(colorname);
UIColor *color = [UIColor performSelector:labelColor];
return color;
}
你可以简单地为你的字符串使用这种格式@"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];
基于@trojanfoe的优秀答案,我做了一个基于类别的解决方案,我用它来动态配置UIViewControllers从他们的信息。Plist文件(当你有许多应用程序共享一个共同的代码库时很有用):
用户界面颜色+ String.h:
#import <UIKit/UIKit.h>
@interface UIColor (String)
+(UIColor*) colorFromString:(NSString*) string;
@end
用户界面颜色+ 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];
(这假设你编辑了你的信息。并添加了一个字典"Theme",主题为"colors",主题为"NavigationBar",标题为NSString,值为:"1 0 0 1"(红色))
(下面寻找编辑)
我将使用查找表。在这种情况下,一个字典将保存可能的值作为键和值作为UIColor对象。例如:
NSDictionary *colorTable = @{
@"blackColor" : [UIColor blackColor],
@"greenColor" : [UIColor greenColor],
@"redColor" : [UIColor redColor]
};
这样当你想"转换"一个颜色字符串时,你可以:
UIColor *myConvertedColor = [colorTable objectWithKey:@"blackColor"];
myConvertedColor将是UIColorBlack。
希望这对你有帮助!好运!
,>> EDIT<& lt;——
好的,这里是经过测试的代码。把它放在干净的地方,这样你就不会受到其他可能正在运行的东西的干扰。注意,我假设iOS…否则更改UIColor为NSColor.
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 0MyColorNULL:(空)
如您所见,MyColorNULL是为了证明您不应该进行搜索,而另一个则证明我的代码可以工作。
如果有帮助,请把我的答案标记为正确。如果不行,我们继续解决。