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

Удалить все ключи из словаря 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 и т.д., какой метод мне нужно выполнить, чтобы удалить все ключи, чтобы NSUserDefaults как в первый раз я запускаю приложение?

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

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

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

EDIT:

Я пробовал:

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Кратчайший способ сделать это с теми же результатами, что и в топ-ответе Алекса Никола:

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

Ответ 3

Один лайнер:

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

Ответ 4

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

Цель C:

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

В Swift 3.0:

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

Ответ 5

+ (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 и копии диска и памяти пользовательских значений по умолчанию не будут содержать ни одного из значений, установленных вашим приложением.

Ответ 6

Быстрая версия:

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

Ответ 7

Oneliner in Swift:

Swift 3

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

Swift 4

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

Ответ 8

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

Swift 3:

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

Ответ 9

Для Swift 3:

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

Ответ 10

Для Swift 3:

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

Ответ 11

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()

}

Ответ 12

стриж
место в вашей логике

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

Ответ 13

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

+ (void)resetStandardUserDefaults

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

resetStandardUserDefaults

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

+ (void)resetStandardUserDefaults

Обсуждение

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

Исходя из этого, вы можете:

[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];

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

Ответ 14

Swift 2.3:

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

Ответ 15

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

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

Ответ 16

Чтобы удалить все значения UserDefault в swift (последний синтаксис)

//remove UserDefaults
  if let identifier = Bundle.main.bundleIdentifier {
      UserDefaults.standard.removePersistentDomain(forName: identifier)
      UserDefaults.standard.synchronize()
  }