Подтвердить что ты не робот

Как сохранить пользовательские настройки для моего iPhone-приложения?

Название вопроса в значительной степени отдает его - я хочу, чтобы мое приложение запоминало несколько вещей. Это какой-то калькулятор, поэтому он должен сохранять последние использованные значения и некоторые пользовательские настройки.

В основном я бы хотел сохранить несколько float и BOOLs и загрузить их снова в следующий раз, когда приложение загрузится.

Какой лучший и простой способ сделать это?

Спасибо!!

4b9b3361

Ответ 1

Один из самых простых способов - сохранить его в NSUserDefaults:

Установка:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

[userDefaults setObject:value 
                 forKey:key];
// – setBool:forKey:
// – setFloat:forKey:  
// in your case 
[userDefaults synchronize];

Получение:

[[NSUserDefaults standardUserDefaults] objectForKey:key];

– boolForKey:

и

– floatForKey: в вашем случае.

Ответ 2

Помимо очень хорошего подхода NSUserDefaults, существует еще один простой способ хранения данных из NSArray, NSDictionary или NSData в файле. Вы также можете использовать эти методы:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag

соответственно (для NSDictionary):

+ (id)dictionaryWithContentsOfFile:(NSString *)path

вам просто нужно указать допустимый путь к местоположению. В соответствии с Руководством по программированию приложений iOS каталог /Library/Caches будет лучшим местом для хранения данных, которые необходимо сохранить между запусками приложений. (см. здесь)

Чтобы хранить/загружать словарь из поданного под названием "менеджеры" в вашем документе directoy, вы можете использовать следующие методы:

-(void) loadDictionary {
    //get the documents directory:
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cacheDirectory = [paths objectAtIndex:0];
    //create a destination file name to write the data :
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory];
    NSDictionary* panelLibraryContent = [NSDictionary dictionaryWithContentsOfFile:fullFileName];
    if (panelLibraryContent != nil) {
        // load was successful do something with the data...
    } else {
        // error while loading the file
    }   
}

-(void) storeDictionary:(NSDictionary*) dictionaryToStore {
    //get the documents directory:
    NSArray *paths = NSSearchPathForDirectoriesInDomains
    (NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cacheDirectory = [paths objectAtIndex:0];
    //make a file name to write the data to using the
    //cache directory:
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory];

    if (dictionaryToStore != nil) {
        [dictionaryToStore writeToFile:fullFileName atomically:YES];
    }
} 

В любом случае этот подход очень ограничен, и вам нужно потратить много дополнительной работы, если вы хотите хранить более сложные данные. В этом случае API CoreData очень удобен.

Ответ 4

В Swift:

Настройка

let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(value, forKey: key)

// userDefaults.setFloat(12.34, forKey: "myFloatKey")
// userDefaults.setBool(true, forKey: "myBoolKey")

Обратите внимание, что для iOS 8 и более поздних версий вызов userDefaults.synchronize() не рекомендуется.

Получение

let userDefaults = NSUserDefaults.standardUserDefaults()
if let value = userDefaults.objectForKey(key) {
    print(value)
}

Обратите внимание, что userDefaults.boolForKey и userDefaults.floatForKey возвращают необязательные значения, поэтому они никогда не будут nil (только false или 0.0).

Дальнейшее чтение