2013-12-02 1 views
0

Итак, я новичок в Obj-C (с опытом работы на C и C++), и я пробовал вещи.
Проще говоря, я хочу сохранить и загрузить оценку и уровень пользователя по мере их продвижения.
У меня есть 3 функции, getFilePath, loadData и savaData.Сохранить NSNumber в plist, не работает

Мои getFilePath и loadData, похоже, работают нормально, но я не могу получить saveData для работы.

вот мой код для него:

-(void)saveData 
{ 
    NSNumber *updatedScore = [NSNumber numberWithInt:score]; 
    NSNumber *updatedLevel = [NSNumber numberWithInt:level]; 
    NSLog(@"The level im saving is %@",updatedLevel); 
    NSLog(@"The score im saving is %@",updatedScore); 
    NSMutableArray *value = [[NSMutableArray alloc]initWithObjects:updatedLevel,updatedScore, nil]; 
    [value writeToFile:[self getFilePath] atomically:YES]; 
} 

-(NSString *)getFilePath 
{ 
    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES); 
    NSLog(@"the path is %@",pathArray); 
    return [[pathArray objectAtIndex:0]stringByAppendingPathComponent:@"saved.plist"]; 
} 

Моих NSLog сообщений возвращают правильные значения и пользователь прогрессирует уровни, но я не в состоянии спасти их.

+0

Приведем некоторую ошибку ?? –

+0

Метод 'getFilePath' –

+0

Вы можете показать нам' getFilePath'? Ошибка в пути - очень общий источник такого рода проблем. – Rob

ответ

7

Вопрос заключается в том, что метод getFilePath использует NSDocumentationDirectory, а не NSDocumentDirectory. К сожалению, автоматическая полная логика Xcode делает слишком легким выбор неправильного. далее


Два предложения:

  1. Вы, вероятно, следует проверить результат writeTofile, возможно, что-то вроде:

    NSArray *array1 = @[@1, @5, @3.423]; 
    BOOL success = [array1 writeToFile:path atomically:YES]; 
    NSAssert(success, @"%s: write failed", __FUNCTION__); 
    
  2. лично, так как я часто использую этот шаблон для создания строка, которая ссылается на путь файла в каталоге NSDocumentDirectory, я создал для него фрагмент кода, который исключает возможность Я ошибаюсь. Это дает мне «автозаполнение» для нескольких строк кода. Итак, предположим, что у меня есть следующие две строки в моем коде:

    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
    NSString *path   = [documentsPath stringByAppendingString:<#filename#>]; 
    

    Очевидно, что использование любой код, который вы хотите, но ключ использовать <#filename#> заполнитель для параметра stringByAppendingString. Затем, как описано в документации Creating a Custom Code Snippet (или см. Файл NSHipster discussion on the topic), вы можете перетащить эти две строки кода в библиотеку фрагментов, чтобы дать ему хорошее имя (и, что еще важнее, хороший ярлык, я использую «documentsPath» для моего ярлыка). Теперь, в будущем, я могу просто начать набирать «documentsPath» в своем коде, и мне будут предложены эти две строки кода.

    С тех пор как я начал использовать этот фрагмент кода, я никогда не ошибался в случайном захвате неправильного значения вместо NSDocumentDirectory.

+0

Спасибо тонну! Работал как сон! –

+2

+1 Для ** Автоматическая логика Xcode делает все слишком просто, чтобы выбрать неправильный ** –

+0

+1 для такого орлиного глаза, ловя точную проблему. –

1

documentation for writeToFile:atomically: указывает, что только типы NSString, NSData, NSArray или NSDictionary можно записать в файл.

Для записи NSNumber данных в файл Загляни в альтернативные методы сериализации, как: NSKeyedArchiver, NSPropertyListSerialization или NSJSONSerialization

+0

Так как я могу сохранить NSNumber? –

+0

@ user3046579 'NSNumber' отлично работает (несмотря на то, что говорится в документации). Проблема заключается в 'NSDocumentationDirectory'. – Rob