Delete all keys from a NSUserDefaults dictionary iOS

ios objective-c swift cocoa-touch nsuserdefaults

56014 просмотра

15 ответа

I use the NSUserDefaults dictionary to store basic information such as high scores etc so that when the user closes the app data is not lost. Anyways I use:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

to store data. If I wish to store a new high score for example then I would do:

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

and later if I wish to retrieve the high score I would do:

[prefs integerForKey:@"highScore"];

anyways the point is that I store a lot of other things because the NSUserDefaults enable you to store booleans, integers, objects etc. what method would I have to execute to delete all keys so that NSUserDefaults becomes like the fist time I launch the app?

I am looking for something like:

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

or maybe there is a way of getting all keys and I have to loop through each object but I don't know how to remove them.

EDIT:

I have tried :

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

and I still am able to retrieve a high score....

Автор: Tono Nam Источник Размещён: 14.07.2019 11:01

Ответы (15)


142 плюса

Решение

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

- (void)resetDefaults {
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}
Автор: Alex Nichol Размещён: 22.07.2011 11:24

70 плюса

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

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];
Автор: skywinder Размещён: 19.09.2013 10:59

44 плюса

Один лайнер

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Автор: Cameron E Размещён: 12.07.2014 04:07

23 плюса

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

Цель C:

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

В Swift 3.0:

if let appDomain = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
Автор: Sourabh Sharma Размещён: 14.10.2016 09:27

16 плюса

Swift версия:

if let bid = NSBundle.mainBundle().bundleIdentifier {
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   
Автор: superarts.org Размещён: 18.03.2015 04:24

16 плюса

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

Автор: darvids0n Размещён: 27.05.2012 03:51

9 плюса

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

Свифт 3:

for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
     UserDefaults.standard.removeObject(forKey: key)
}
Автор: bogen Размещён: 27.03.2017 09:22

8 плюса

Oneliner в Swift:

Свифт 3

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

Swift 4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Автор: netshark1000 Размещён: 22.05.2016 10:40

5 плюса

Для Swift 3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
Автор: Taichi Kato Размещён: 27.11.2016 08:41

5 плюса

Для Swift 3:

if let bundle = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundle)
}
Автор: Jay Mehta Размещён: 21.02.2017 01:45

2 плюса

стриж

 func resetUserDefaults(){

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

    for key in dict.allKeys {

            userDefaults.removeObjectForKey(key as! String)
    }

    userDefaults.synchronize()

}
Автор: Dhananjay Patil Размещён: 14.04.2017 05:18

2 плюса

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

if let appDomain = Bundle.main.bundleIdentifier {
       UserDefaults.standard.removePersistentDomain(forName: appDomain)
     }
Автор: Sai kumar Reddy Размещён: 06.09.2018 10:30

1 плюс

Разве этот метод не делает это:

+ (void)resetStandardUserDefaults

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

resetStandardUserDefaults

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

+ (void)resetStandardUserDefaults

обсуждение

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

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

[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];

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

Автор: PengOne Размещён: 22.07.2011 11:20

1 плюс

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

func clearAll() {
    let settingsDictionary = userDefaults.dictionaryRepresentation()
    settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) }
    userDefaults.synchronize()
}
Автор: Dzmitry Chyrta Размещён: 22.08.2017 12:08

0 плюса

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

//remove UserDefaults
  if let identifier = Bundle.main.bundleIdentifier {
      UserDefaults.standard.removePersistentDomain(forName: identifier)
      UserDefaults.standard.synchronize()
  }
Автор: Hardik Thakkar Размещён: 27.04.2019 11:43
Вопросы из категории :
32x32