Устранение NSUserDefaults

голоса
274

Я использую +[NSUserDefaults standardUserDefaults]для хранения настроек приложения. Она состоит из примерно дюжины строковых значений. Можно ли удалить эти значения постоянно вместо того , чтобы просто установив их значения по умолчанию?

Задан 13/02/2009 в 08:49
источник пользователем
На других языках...                            


15 ответов

голоса
495

Вы можете удалить упорный домен приложения, как это:

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

В Swift 3 и позже:

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

Это похоже на ответ по @samvermette, но немного чище IMO.

Ответил 26/07/2011 в 03:55
источник пользователем

голоса
101

Этот код сбрасывает по умолчанию в области регистрации:

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

Другими словами, removeObjectForKeyдля каждого ключа , который вы когда - либо зарегистрированного в этом приложении.

Кредиты Кен Томасов на этой компании Apple для разработчиков Форумы нить.

Ответил 10/06/2010 в 05:40
источник пользователем

голоса
95

Пробовали ли вы используете - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Ответил 13/02/2009 в 08:51
источник пользователем

голоса
29

Вот ответ на Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Ответил 15/04/2015 в 14:36
источник пользователем

голоса
27

Если вам это нужно, а развивающиеся, вы можете восстановить свой тренажер, удаление всех NSUserDefaults .

IOS Simulator -> Сброс контента и настроек ...

Имейте в виду, что это также удалит все приложения и файлы на тренажере.

Ответил 06/09/2011 в 15:54
источник пользователем

голоса
13
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Ответил 20/01/2014 в 04:56
источник пользователем

голоса
6

В Swift:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Ответил 18/08/2016 в 10:36
источник пользователем

голоса
5

Я люблю расширение, когда они делают уборщик кода:

extension NSUserDefaults {
    func clear() {
        guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
            return
        }

        self.removePersistentDomainForName(domainName)
    }
}
Ответил 22/08/2016 в 22:33
источник пользователем

голоса
5

Примечание: Этот ответ был обновлен для Swift тоже.

Как насчет иметь в одной строке?

Расширение @Christopher Rogers ответ - принял один.

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

и да, иногда вам может понадобиться synchronizeэто,

[[NSUserDefaults standardUserDefaults] synchronize];

Я создал метод, чтобы сделать это,

- (void) clearDefaults {
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

Swift ?

С быстрым его еще более легким.

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
        self.standard.removePersistentDomain(forName: aValidIdentifier)
        self.standard.synchronize()
    }
}

И использование :

UserDefaults.clean()
Ответил 11/08/2015 в 06:02
источник пользователем

голоса
5

Я нашел это:

osascript -e 'tell application "iOS Simulator" to quit'
xcrun simctl list devices | grep -v '^[-=]' | cut -d "(" -f2 | cut -d ")" -f1 | xargs -I {} xcrun simctl erase "{}"

Источник: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab

Ответил 04/12/2014 в 18:33
источник пользователем

голоса
2

Это ошибка или что - то , но removePersistentDomainForNameне работает, очищая все NSUserDefaultsзначения.

Таким образом, лучше вариант заключается в том , чтобы сбросить PersistentDomainи что вы можете сделать с помощью следующим образом:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Ответил 09/03/2016 в 08:28
источник пользователем

голоса
1

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

Ответил 16/10/2014 в 09:44
источник пользователем

голоса
1

Расширение на ответ @ Folse ... Я считаю, что правильнее было бы осуществление ...

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
    for (NSString *key in [defaultsDictionary allKeys]) {
      NSLog(@"removing user pref for %@", key);
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    }

... называя persistentDomainForName NSUserDefault в: метод. Поскольку состояние Документов, метод «Возвращает словарь, содержащий ключи и значение в указанной персистирующей домене.» Вызов dictionaryRepresentation: вместо этого, возвращает словарь, который, вероятно, включать в себя другие параметры, как он относится к более широкому охвату.

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

Ответил 18/02/2014 в 02:42
источник пользователем

голоса
0

Попробуйте это, он работает для меня.

Одна строка кода

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Ответил 01/03/2018 в 05:57
источник пользователем

голоса
0

если установка приложения необходимости сброса nsuserdefault для доступа к микрофону (мой случай), простое решение является ответом от Энтони McCormick ( Iphone - Как разрешить доступ приложения к средствам массовой информации на устройстве - ALAssetsLibraryErrorDomain Code = -3312 «Global отказано в доступе» ).

на устройстве, перейдите в раздел Настройки> Общие> Сброс> Сбросить предупр

Ответил 15/08/2014 в 00:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more