- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在数据模型中,我将颜色定义为可转换属性,并将 ColorTransformer 分配给它。它可以工作,在同一个变压器的帮助下,我可以将它绑定(bind)到 ColorPicker,保存和打开文档。 但是当我尝试从代码访问它时:
NSColor * color = corner.color;
NSLog(@"Corner Color = %@\n%@", color, color.class);
我有 NSMutableConcreteData 对象:
bezierMesh[22164:730708] Corner Color = <040b7374 7265616d 74797065 6481e803 84014084 8484074e 53436f6c 6f720084 84084e53 4f626a65 63740085 84016301 84046666 66660183 6eb7613d 8357703e 3e8352b8 1e3f86>
NSConcreteMutableData
修改 getter 和 setter 没有帮助:
- (NSColor *)color {
[self willAccessValueForKey:@"color"];
NSData *colorData = [self primitiveValueForKey:@"color"];
[self didAccessValueForKey:@"color"];
if (colorData == nil) {
return nil;
}
NSColor * color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
return color;
}
- (void)setColor:(NSColor *)color {
NSLog(@" -------------- > Setting color %@", color);
NSData * theData=[NSArchiver archivedDataWithRootObject:color];
[self willChangeValueForKey:@"color"];
[self setPrimitiveValue:theData forKey:@"color"];
[self didChangeValueForKey:@"color"];
}
它会导致错误:
[NSKeyedUnarchiver initForReadingWithData:]: non-keyed archive cannot be decoded by NSKeyedUnarchiver
如何获取颜色NSColor?
最佳答案
这是我不久前编写的一个 NSString
<-> NSColor
转换器,它旨在使用 NSUserDefaults
中的 RGB 值存储颜色因为我不喜欢默认使用 NSData
对象:
StringColourTransformer.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 [NSColor 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
如您所见,我提供了几个类方法,以便更轻松地从代码中使用它(toString
和 fromString
)。
它需要在应用程序生命周期的早期注册,以便可以用于转换 IB 内的值(这是从单例中调用的,其中 _stringColourTransformer
是实例变量):
_stringColourTransformer = [[StringColourTransformer alloc] init];
[NSValueTransformer setValueTransformer:_stringColourTransformer
forName:@"StringColourTransformer"];
转换非常简单:
NSColor *colour = [StringColourTransformer fromString:@"1.0 1.0 0.0 1.0"];
注意:现在查看代码,我可能会在 toString
/fromString
方法中使用 [NSValueTranformer valueTransformerForName:]
,而不是创建每次都有一个新实例。可能更便宜。
关于objective-c - 为什么我的 NSColor 类 NSConcreteData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26585988/
我有一个 UIButton,它链接到一些调用 UIPrintInteractionController 来打印 PDF 文档的代码。 如果我点击按钮,会弹出 View 让我选择一台打印机,然后打印文档
我添加了一个 NSData 扩展(base64 扩展),我将其保留在一个单独的基础设施类库项目中。但是当我在主项目中使用此方法时,我收到如下错误:“-[NSConcreteDataencodeBase
以下代码: [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:mapURL]] 返回 NSConcreteData 的实例,而不是 N
我正在使用 AFNetworking 发布带有一些数据的音频。我收到以下异常。 *** Terminating app due to uncaught exception 'NSInvalidArgu
在数据模型中,我将颜色定义为可转换属性,并将 ColorTransformer 分配给它。它可以工作,在同一个变压器的帮助下,我可以将它绑定(bind)到 ColorPicker,保存和打开文档。 但
我正在尝试使用AFNetworking通过POST调用将音频文件上传到Cloudinary。我一直在使用AFNetworking轻松地将POST调用发送到我自己的服务器,但这是我第一次尝试通过AFNe
我正在制作一个文本编辑器应用程序,它将其每个文档存储为 NSFileWrapper 目录,文档文本和文档标题作为目录中的单独文件。我希望 loadFromContents: (id) contents
我正在尝试编写一些代码来验证我的 iOS 应用程序上的订阅。我正在学习本教程:http://savvyapps.com/blog/how-setup-test-auto-renewable-subsc
我在 BugSense 中看到了这个崩溃: -[NSConcreteData count]: unrecognized selector sent to instance 0x14e57f10 - N
我收到错误 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:'-[NSConcreteDa
我是一名优秀的程序员,十分优秀!