2011-06-09 83 views
0

基本上,我正在製作一個應用程序,將數據保存到自定義文件類型中。我已經設置了將字典存檔並將其保存到文件中。然後加載文件,解開字典,並將其放在應該存放的位置。NSDictionary不會正確保存數據

不幸的是,我無法讓我的字典正確保存數據。下面有兩個例子。

工作

NSDictionary *theDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"test", @"test2", nil]; 

這將節省我希望它的方式「測試」,我可以完全加載它。

不工作

NSString *aString = @"test"; 
NSDictionary *theDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:aString, @"test2", nil]; 

這只是給了我一個完全空字符串,當我加載文件。

這是我的確切代碼。

- (NSData*)dataOfType:(NSString *)typeName error:(NSError **)outError { 
    [fileContents release]; 

    NSMutableData *data = [NSMutableData data]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 

    NSDictionary *theDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:[lifeText stringValue], @"life", [moveText stringValue], @"move", nil]; 
    [archiver encodeObject:theDictionary forKey:@"SomeKeyValue"]; 
    [archiver finishEncoding]; 
    fileContents = [NSData dataWithData:data]; 
    [archiver release]; 

    return fileContents; 
} 

- (BOOL) readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError { 
    fileContents = [data retain]; 

    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
    loadedFileDictionary = [[unarchiver decodeObjectForKey:@"SomeKeyValue"] retain]; 

    [unarchiver finishDecoding]; 
    [unarchiver release]; 

    NSLog(@"%@", [loadedFileDictionary valueForKey:@"life"]); 

    [Card_Building loadLife:[loadedFileDictionary valueForKey:@"life"] move:[loadedFileDictionary valueForKey:@"move"]]; 

    return YES; 
} 

另一個字符串現在設置在別處,但我需要把它們放在這裏。然後,我用「卡Builder.m」下面的代碼放到哪裏我希望他們中的字符串:

+ (void) loadLife:(NSString*)life move:(NSString*)move; { 
    lifeString = life; 
    moveString = move; 
    importData = TRUE; 
} 

我不明白爲什麼這是行不通的。每次我考,我得到一個空字符串和以下錯誤消息:

2011-06-09 13:33:56.082 HS-Cards[6479:a0f] *** Assertion failure in -[NSTextFieldCell _objectValue:forString:errorDescription:], /SourceCache/AppKit/AppKit-1038.35/AppKit.subproj/NSCell.m:1531

2011-06-09 13:33:56.082 HS-Cards[6479:a0f] Invalid parameter not satisfying: aString != nil

會有人請告訴我爲什麼這是不行的?

編輯:與此更新的代碼,它加載一次,並給我相同的錯誤消息,但它然後拒絕加載。有任何想法嗎?

回答

1

如果這是你確切的代碼,那麼它看起來像問題是,你試圖解除存檔值,你沒有存檔開始與鍵(moverangeattack等)。你也把lifeValue到存檔字典兩次,這是不必要的,因爲你使用相同的密鑰倍,而且它有沒有真正的影響:

NSString *lifeValue = [lifeText stringValue]; 
NSDictionary *theDictionary = [[NSDictionary alloc] 
            initWithObjectsAndKeys:lifeValue, @"life", nil]; 
                 // ^^ Once 
[theDictionary setObject:[lifeText stringValue] forKey:@"life"]; 
         // ^^ Again; doesn't really do anything 
+0

我固定的這些問題,但它仍然不會一切工作。還有其他建議嗎? – Justin 2011-06-11 02:46:05

+0

已經有幾天了,我還沒有聽到任何迴應。我是否假設你找不到可能導致此問題的其他問題?順便說一下,我已經更新了代碼。 – Justin 2011-06-15 21:55:42

+0

'loadLife:move:'中的'lifeString'和'moveString'是什麼?您不能在類方法中訪問實例變量。涉及'NSTextFieldCell'的錯誤消息和這個類'CardBuilder'之間的連接完全不清楚。文本字段單元格在哪裏? 'readFromData:...'中的'NSLog'的結果是什麼? – 2011-06-16 07:37:12