Удалить все ключи из словаря NSUserDefaults iOS



Я использую словарь NSUserDefaults для хранения основной информации, такой как высокие баллы и т. д., Чтобы при закрытии пользователем данных приложения не терялись. В любом случае я использую:



NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];


для хранения данных. Если я хочу сохранить новый высокий балл, например, то я бы сделал:



[prefs setInteger:1023 forKey:@"highScore"];
[prefs synchronize]; //this is needed in case the app is closed.


и позже, если я хочу получить высокий балл я бы сделал:



[prefs integerForKey:@"highScore"];


в общем дело в том, что я храню много других вещей, потому что NSUserDefaults enable для хранения booleans, integers,objects etc. какой метод мне нужно выполнить, чтобы удалить все ключи, чтобы NSUserDefaults стал похож на первый раз, когда я запускаю приложение?



Я ищу что-то вроде:



NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];


или, может быть, есть способ получить все ключи, и я должен перебирать каждый объект, но я не знаю, как их удалить.



EDIT:



Я пробовал :



NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];


и я все еще в состоянии получить высокий балл....

554   14  

14 ответов:

Если вы посмотрите на документация NSUserDefaults вы увидите способ - (NSDictionary *) dictionaryRepresentation. Используя этот метод для стандартных пользовательских значений по умолчанию, вы можете получить список всех ключей в пользовательских значениях по умолчанию. Затем вы можете использовать это, чтобы очистить пользовательские значения по умолчанию:

- (void)resetDefaults {
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}

короткий способ сделать это с теми же результатами как в верхнем ответе Алекса Никола:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];

один лайнер

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

Простое Решение

Цель C:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

на Swift 3.0:

if let appDomain = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: appDomain)
}

Swift версия:

if let bid = NSBundle.mainBundle().bundleIdentifier {
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   

+ (void) resetStandardUserDefaults не сохраняет изменения, он просто сбрасывает объект по умолчанию пользователя в памяти, чтобы следующий synchronize вызов будет считываться из копии на диске, вместо перезаписи существующих значений в памяти с версиями на диске.

итерация по клавишам лучше, но на самом деле есть функция, которая делает это для вас: removePersistentDomainForName:.

// you can usually get the domain via [[NSBundle mainBundle] bundleIdentifier]
[[NSUserDefaults standardUserDefaults]
 removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
// or use a string for any other settings domains you use
//[[NSUserDefaults standardUserDefaults]
// removePersistentDomainForName:@"com.mycompany.myappname"];
[[NSUserDefaults standardUserDefaults] synchronize];

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

для тех из вас, кто хочет сделать это в тестовой цели, используйте это (как removePersistentDomain не работает в этом случае)

Swift 3:

for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
     UserDefaults.standard.removeObject(forKey: key)
}

Oneliner в Swift:

Swift 3

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)

Swift 4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

Для Swift 3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)

Для Swift 3:

if let bundle = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundle)
}

Swift

 func resetUserDefaults(){

    let userDefaults = NSUserDefaults.standardUserDefaults()
    let dict = userDefaults.dictionaryRepresentation() as NSDictionary

    for key in dict.allKeys {

            userDefaults.removeObjectForKey(key as! String)
    }

    userDefaults.synchronize()

}

этот метод не делает этого:

+ (void)resetStandardUserDefaults

из документации NSUserDefaults:

resetStandardUserDefaults

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

+ (void)resetStandardUserDefaults

Обсуждение

при последующем вызове standardUserDefaults создается новый общий ресурс объект по умолчанию пользователя с помощью стандартный список поиска.

исходя из этого, можно сделать:

[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];

и теперь значения по умолчанию должны быть сброшены.

Swift 3 или 4 Мы можем даже упростить описанный фрагмент в это современное выражение:

func clearAll() {
    let settingsDictionary = userDefaults.dictionaryRepresentation()
    settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) }
    userDefaults.synchronize()
}

Свифт
место в твоей логике

if let appDomain = Bundle.main.bundleIdentifier {
       UserDefaults.standard.removePersistentDomain(forName: appDomain)
     }

Comments

    Ничего не найдено.