2013-08-22 50 views
4

我從OS X應用程序獲得了一個項目文件,它是使用NSKeyedArchiver生成的plist。我需要以編程方式更改其中的一個字符串。解碼,然後用NSKeyedArchiver編碼未知的類?

基本上,它包含基礎類的NSDictionary對象。但是有一個自定義類(GradientColor)。我自己定義了它,並嘗試在initWithCoder:和encodeWithCoder中做任何事情:但目標應用程序崩潰嘗試讀取新生成的項目文件。所以它在初始化時不能正確處理零值。

可不知何故,我知道用的initWithCoder初始化時,它的鍵分別對應於我的類:以它們編碼回來不變(NSCoder *)aDecoder?

+0

我相信你就必須有自定義類的實現讀/寫相同數據.. –

回答

1

我已經恢復該類(GradientColor)的實現。事實上,它存儲的數據的一個非常小的量:

@interface GradientColor : NSView <NSCoding> { 
    float location; 
    NSColor *color; 
} 
@end 

@implementation GradientColor 
- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeFloat:location forKey:@"location"]; 
    [aCoder encodeObject:color forKey:@"color"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 
    if (self) { 
     location = [aDecoder decodeFloatForKey:@"location"]; 
     color = [aDecoder decodeObjectForKey:@"color"]; 
    } 
    return self; 
} 
@end 

我的版本不執行任何操作,但序列化和反序列化正確作爲原始的實現。我已經在plist中查找了需要的鍵和類型。現在我的CLI工具生成有效的項目文件。

在這裏,我發現NSKeyedArchive的內部結構的好崗位,這對我幫助很大:http://digitalinvestigation.wordpress.com/2012/04/04/geek-post-nskeyedarchiver-files-what-are-they-and-how-can-i-use-them/