Я використовую +[NSUserDefaults standardUserDefaults]
для зберігання налаштувань програми. Складається приблизно з десятка значень рядків. Чи можна назавжди видалити ці значення, а не просто встановити їх за замовчуванням?
Я використовую +[NSUserDefaults standardUserDefaults]
для зберігання налаштувань програми. Складається приблизно з десятка значень рядків. Чи можна назавжди видалити ці значення, а не просто встановити їх за замовчуванням?
Відповіді:
Ви можете видалити постійний домен програми так:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
У Swift 3 та пізніших версіях:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Це схоже на відповідь @samvermette, але трохи чистіше IMO.
Цей код скидає за замовчуванням реєстраційний домен:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Іншими словами, це removeObjectForKey
для кожного ключа, який ви коли-небудь зареєстрували в цьому додатку.
[NSUserDefaults resetStandardUserDefaults]
цього не зробити, це поза мене.
Ви спробували використовувати - removeObjectForKey
?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Ось відповідь у Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
one-liner
if let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Якщо вам це потрібно під час розробки, ви також можете скинути ваш тренажер, видаливши всі NSUserDefaults
.
iOS Simulator -> Скидання вмісту та налаштувань ...
Майте на увазі, що він також видалить усі програми та файли на тренажері.
Примітка. Ця відповідь оновлена і для Swift.
А як бути з ним на одній лінії?
Розширена відповідь @Christopher Rogers - прийнята.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
і так, колись вам це знадобиться synchronize
,
[[NSUserDefaults standardUserDefaults] synchronize];
Я створив метод для цього,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Швидкий ?
Зі швидким його ще легше.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
І використання :
UserDefaults.clean()
Я люблю розширення, коли вони роблять код чистішим:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Швидкий 5
extension UserDefaults {
func clear() {
guard let domainName = Bundle.main.bundleIdentifier else {
return
}
removePersistentDomain(forName: domainName)
synchronize()
}
}
Я знайшов це:
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
Це помилка чи що завгодно, але removePersistentDomainForName
не працює при очищенні всіх NSUserDefaults
значень.
Отже, кращий варіант полягає в тому, щоб скинути PersistentDomain
і що ви можете зробити наступним чином:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Розширення на відповідь @ 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: натомість повертає словник, який, ймовірно, включає інші параметри, оскільки він застосовується до ширшої області застосування.
Якщо вам потрібно відфільтрувати будь-яке значення, яке потрібно скинути, це зробити це повторенням клавіш. Очевидно, що якщо ви хочете просто занурити всі префікси для програми без огляду, то один з інших способів, розміщених вище, є найбільш ефективним.
якщо налаштування програми, що потребує скидання, має nsuserdefault для доступу до мікрофона (мій випадок), просте рішення - відповідь від Ентоні МакКорміка ( Iphone - Як увімкнути доступ програми до медіа на пристрої? - ALAssetsLibraryErrorDomain Code = -3312 "Глобальний відхилений доступ" ).
на пристрої перейдіть у Налаштування> Загальне> Скидання> Скидання попереджень про місцезнаходження
Спробуйте це, це працює для мене.
Єдиний рядок коду
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];