Як видалити значення користувача за замовчуванням у NSUserDefaults?


79

Тобто, мій додаток встановлює деякі стандартні значення за замовчуванням на початку. Тоді ці значення можуть бути замінені користувачем. І коли користувач псує речі, я хочу повернути ці налаштування до значень за замовчуванням для мого додатка. Як я розумію, за замовчуванням програми є іншим словником, ніж за замовчуванням користувача, і за замовчуванням користувач просто перекриває ці за замовчуванням програми. Але я не бачив методів видалення стандартних налаштувань користувача. Будь-яка ідея?

Відповіді:



97

Використовуйте цей код

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"MyKey"];

не забудьте синхронізувати, якщо ви хочете негайно зберегти

[[NSUserDefaults standardUserDefaults] synchronize];

Довідник класу NSUserDefaults

синхронізація - Цей метод автоматично викликається через періодичні проміжки часу, використовуйте цей метод, лише якщо ви не можете дочекатися автоматичної синхронізації (наприклад, якщо ваша програма збирається вийти) або якщо ви хочете оновити стандартні налаштування користувача до того, що є на диску, навіть хоча ви не внесли жодних змін.

Свіфт 5:

UserDefaults.standard.removeObject(forKey: "MyKey")
UserDefaults.standard.synchronize()

2
+1 для [[NSUserDefaults standardUserDefaults] синхронізації]; Зазвичай я забуваю це додати.
Августин

якщо ви не синхронізуєтесь, він автоматично синхронізує його, коли ви закриєте програму.
Юсель Байрам,

1
@yucelbayram -> yup, але якщо ви хочете негайно зберегти, вам доведеться синхронізувати.
Rajneesh071

1
@ Rajneesh071 так, це правда.
Юсель Байрам

В даний час документація Apple говорить про метод синхронізації: "Чекає будь-яких очікуваних асинхронних оновлень бази даних за замовчуванням і повертається; цей метод непотрібний і не повинен використовуватися." Вам більше не потрібно цим користуватися.
anders32

8
NSUserDefaults * removeUD = [NSUserDefaults standardUserDefaults];
[removeUD removeObjectForKey:@"shoping"];
[[NSUserDefaults standardUserDefaults]synchronize ];

8

Швидка версія для зручного вставлення копії:

var idForUserDefaults = "somestupidtext"
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.removeObjectForKey(idForUserDefaults)
userDefaults.synchronize()

або

NSUserDefaults.standardUserDefaults().removeObjectForKey("somestupidtext")
NSUserDefaults.standardUserDefaults().synchronize()

У документах Apple зазначено, що .synchronize() "непотрібно і не повинно використовуватися. Developer.apple.com/documentation/foundation/userdefaults/…
Джеймс Джордан Тейлор

6

Щоб видалити певне значення KEY:

Свіфт 3+

UserDefaults.standard.removeObject(forKey: "KEY")

Obj-C

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"KEY"];
[[NSUserDefaults standardUserDefaults] synchronize];

Якщо вам потрібно скинути налаштування UserDefaults / Clear All data :

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

Свіфт 3:

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

4

Оновлено для коду Swift 3.0:

UserDefaults.standard.removeObject(forKey: "YOURKEY")


2
Value of type 'UserDefaults' has no member 'remove'
Чарлі Фіш,

1
kbunarjo, ти навіть спробував це. ЛОЛ. Swift 3 -UserDefaults.standard.removeObject (forKey: "Key")
Джефф,

1
@Jeff нещодавно вони випустили нову версію Swift 3 (3.1). Я ще не заглядав у документи, тому припускаю, що саме тому моя версія вже не працює.
kbunarjo

Так, це здалося смішним :)
Джефф,

1
UserDefaults.standard.removeObject (forKey: "YOURKEY");
Мартин Чемберлін,


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.