我正在使用自定義NSValueTransformer將顏色信息存儲在我的Core Data存儲中。一旦顏色數據已經存儲在商店中(即一旦應用程序已經運行並退出一次),Transformable數據和UIColor實例之間的轉換就非常有效。但是,當我第一次運行應用程序並加載這些值時(來自文本文件),它們「卡住」爲NSCFStrings。使用NSValueTransformer設置NSManagedObject實例的值
在這行代碼中,「屬性」是一個字典,其中包含NSManagedObject屬性名稱和值,這些屬性值是這些屬性的期望值。在我的顏色例子鍵值對是「彩色」:「1,1,1,0.5」
[object setValue:[attributes valueForKey:attribute] forKey:attribute];
爲「顏色」的值將在現在這種情況下仍然是一個字符串,直到它得到通過我NSValueTransformer轉化然後在應用程序再次運行時重新轉換爲UIColor。
我可以在這裏做同樣的轉換,我在NSValueTransformer中做,但這是在我寫的實用程序類中,理論上可以用於任何變壓器。我也想過找到一種方法將所有新創建的NSManagedObject實例放到內存中,從而強制轉換通過,但這看起來像是一種破解。
注意:這個「黑客」適用於我,讓我繼續,但仍然感到難看。如果您遇到類似問題/尋找「正常工作」解決方案,請使用NSManagedObjectContext的重置方法。
任何想法?
(我有一種預感,這是類似「Why is my transformable Core Data attribute not using my custom NSValueTransformer?」,但標題之外我們的問題似乎是不同的)
這裏是我的NSValueTransformer
@implementation UIColorRGBValueTransformer
+ (Class)transformedValueClass
{
return [NSData class];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)transformedValue:(id)value
{
return [value dataUsingEncoding:NSUTF8StringEncoding];
}
- (id)reverseTransformedValue:(id)value
{
NSString *colorAsString = [[[NSString alloc] initWithData:value encoding:NSUTF8StringEncoding] autorelease];
NSArray *components = [colorAsString componentsSeparatedByString:@","];
CGFloat r = [[components objectAtIndex:0] floatValue];
CGFloat g = [[components objectAtIndex:1] floatValue];
CGFloat b = [[components objectAtIndex:2] floatValue];
CGFloat a = [[components objectAtIndex:3] floatValue];
return [UIColor colorWithRed:r green:g blue:b alpha:a];
return nil;
}
@end
說明:你是什麼意思「......他們」卡住「作爲NSCFStrings。」你的意思是你只能得到字符串值,直到你保存上下文? – TechZen 2011-06-10 14:00:07
是的,這些值在第一次執行期間是NSCFString類型的,但是從那時起UIColors就是這樣。 – rob5408 2011-06-10 16:38:31