Как сохранить пользовательские настройки для моего iPhone-приложения?
Название вопроса в значительной степени отдает его - я хочу, чтобы мое приложение запоминало несколько вещей. Это какой-то калькулятор, поэтому он должен сохранять последние использованные значения и некоторые пользовательские настройки.
В основном я бы хотел сохранить несколько float и BOOLs и загрузить их снова в следующий раз, когда приложение загрузится.
Какой лучший и простой способ сделать это?
Спасибо!!
Ответы
Ответ 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 очень удобен.
Ответ 3
Вы ищете NSUserDefaults
Ответ 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
).
Дальнейшее чтение
Ответ 5
Swift 4/Linux
Видимо, что-то изменилось. Теперь существует класс UserDefault
.
Проверьте эти ссылки:
https://developer.apple.com/documentation/foundation/userdefaults
https://www.hackingwithswift.com/read/12/2/reading-and-writing-basics-userdefaults