3

我正在使用自定義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 
+0

說明:你是什麼意思「......他們」卡住「作爲NSCFStrings。」你的意思是你只能得到字符串值,直到你保存上下文? – TechZen 2011-06-10 14:00:07

+0

是的,這些值在第一次執行期間是NSCFString類型的,但是從那時起UIColors就是這樣。 – rob5408 2011-06-10 16:38:31

回答

0

你真的不使用可預測的可變形屬性。你的方法應該在理論上工作,但它是一個醜陋的混亂。

當你想做非標準的事情時,你通常只需要爲系統定義的類寫一個自定義值轉換器。在絕大多數情況下,首選方法是使用默認的NSKeyedUnarchiveFromDataTransformerName。任何實現NSCoding協議的類都可以使用該值轉換器。由於UIColor確實實現了NSCoding協議,因此您可以將該屬性設置爲'transformable'並且NSKeyedUnarchiveFromDataTransformerName將自動填充變換器名稱(至少在Xcode 3.x中是這樣做的)。在使用中,Core Data將創建適當的訪問,所以你可以設置和獲取的UIColor屬性,就像任何其他鍵:

[aMoObject setValue:aUIcolorObj forKey:@"colorAttributeName"]; 

作爲一個很好的經驗法則,API會做的大部分工作,爲您的API類的情況。如果你發現自己在系統課上努力工作,你可能錯過了一些東西。

+0

感謝您的回覆。我最初得出了原因,因爲這裏的答案「http://stackoverflow.com/questions/2304882/core-data-data-model-attribute-type-for-uicolor」明確表示UIColor不符合NSCoding。不幸的是,我從來沒有想過要爲自己檢查「事實」。不知何故,這一切都最終爲我工作,因爲顏色的原始數據來源於(文本文件中的1,1,1,0.5)。我想我會刪除轉換器,並找出一種方便的方式將UIColor作爲文本存儲在我的json文件中,然後讓系統將其存儲並存儲。 – rob5408 2011-06-10 16:45:52

相關問題