По сути, я делаю приложение, которое сохраняет данные в пользовательский тип файла. У меня есть его настройки, чтобы заархивировать словарь и сохранить его в файл. Затем он загружает файл, разархивирует словарь и помещает вещи туда, где они должны быть.
К сожалению, я не могу заставить свой словарь на самом деле правильно сохранить данные. У меня есть два примера ниже.
Рабочая
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;
}
Другая строка в данный момент установлена в другом месте, но мне нужно будет также разместить их здесь. Затем я использую следующий код в «Card 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
Кто-нибудь, пожалуйста, скажите мне, почему это не сработает?
РЕДАКТИРОВАТЬ: с этим обновленным кодом, он загружается один раз и выдает те же сообщения об ошибках, но затем отказывается загружаться. Есть идеи?