2012-08-13 35 views
2

我在我的OS X應用程序中實現了對Lion的「簡歷」功能的支持。NSKeyedArchiver:區分同一類的不同實例

我有NSViewController的一個自定義的子類,其中我實現的方法 encodeRestorableStateWithCoder:如:

@implementation MyClass (Restoration) 
    -(void)encodeRestorableStateWithCoder:(NSCoder*)coder { 
     [coder encodeObject:_dataMember forKey:@"object_key"]; // I get the warning below when this line is executed for the second time 
    } 
    - (void)restoreStateWithCoder:(NSCoder *)coder { 
     _dataMember = [coder decodeObjectForKey:@"object_key"]; 
    } 
@end 

但是,由於我的MyClass多個實例,不同的值被保存到相同的鍵(「object_key 「),我得到可可以下警告:

的NSKeyedArchiver警告:替換現有的價值關鍵 ‘object_key’;在類層次結構中可能出現重複編碼鍵

解決此問題的最佳做法是什麼?

編輯:我發現here每個實例自動擁有自己的命名空間,以避免衝突,所以這個問題可能是我手動調用encodeRestorableStateWithCoder具有相同NSCoder對象的不同實例的方式,而不告訴它,這些是不同的例子。但是,我仍然無法弄清楚如何正確地做到這一點。

在此先感謝!

回答

1

爲了克服這個問題,它可以創建其中的每一個由單獨的(新)NSKeyArchiver寫入新NSMutableData,並把它們全都存儲其中存儲在原始NSCoder對象陣列。

下面是編碼子項的可恢復狀態的示例。解碼部分可以直接給出這個代碼。

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [super encodeRestorableStateWithCoder:coder]; 

    // Encode subitems states: 
    NSArray* subitems = self.items; 
    NSMutableArray* states = [NSMutableArray arrayWithCapacity: subitems.count]; 
    for (SubItemClass* item in subitems) 
    { 
     NSMutableData* state = [NSMutableData data]; 
     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:state]; 
     [item encodeRestorableStateWithCoder:archiver]; 
     [archiver finishEncoding]; 
     [states addObject:state]; 
    } 
    [coder encodeObject:states forKey:@"subitems"]; 
} 
+0

但是,這不會對編碼'NSViewController'情況下,將它的工作? – adib 2013-02-13 01:31:10

+0

我認爲它應該適用於'NSViewController',爲什麼不呢? – 2013-02-13 08:30:58

+0

@benuri [這是爲什麼](http://stackoverflow.com/questions/14844966/encoding-nsviewcontroller-for-lions-user-interface-resume-feature)。 – adib 2013-02-13 22:31:25

相關問題