NSDictionary не будет правильно хранить данные - PullRequest
0 голосов
/ 09 июня 2011

По сути, я делаю приложение, которое сохраняет данные в пользовательский тип файла. У меня есть его настройки, чтобы заархивировать словарь и сохранить его в файл. Затем он загружает файл, разархивирует словарь и помещает вещи туда, где они должны быть.

К сожалению, я не могу заставить свой словарь на самом деле правильно сохранить данные. У меня есть два примера ниже.

Рабочая

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

Кто-нибудь, пожалуйста, скажите мне, почему это не сработает?

РЕДАКТИРОВАТЬ: с этим обновленным кодом, он загружается один раз и выдает те же сообщения об ошибках, но затем отказывается загружаться. Есть идеи?

1 Ответ

1 голос
/ 10 июня 2011

Если это ваш точный код, то, похоже, проблема в том, что вы пытаетесь разархивировать значения для ключей (move, range, attack и т. Д.), Которые вы не архивировали для начала с. Вы также помещаете 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
...