我使用+[NSUserDefaults standardUserDefaults]来存储应用程序设置。它由大约12个字符串值组成。是否可以永久删除这些值,而不是将它们设置为默认值?
+[NSUserDefaults standardUserDefaults]
你试过用-removeObjectForKey吗?
removeObjectForKey
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
这段代码将默认值重置为注册域:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
换句话说,它removeObjectForKey为你在那个应用程序中注册的每一个键。
感谢Ken Thomases在这次苹果开发者论坛上的贡献
你可以像这样删除应用程序的持久域:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
在Swift 3及以后版本中:
if let bundleID = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: bundleID) }
这与@samvermette的回答相似,但在我看来更简洁一些。
如果你在开发时需要它,你也可以重置模拟器,删除所有NSUserDefaults。
NSUserDefaults
iOS模拟器->重置内容和设置…
请记住,它也会删除模拟器上的所有应用程序和文件。
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]; for (NSString *key in [defaultsDictionary allKeys]) { [[NSUserDefaults standardUserDefaults] removeObjectForKey:key]; }
扩展@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]; }
...调用NSUserDefault的persistentDomainForName:方法。正如文档声明的那样,该方法“返回一个包含指定持久域中键和值的字典”。相反,调用dictionaryRepresentation:将返回一个可能包含其他设置的字典,因为它应用于更广泛的范围。
如果您需要过滤掉任何要重置的值,那么迭代键就是一种方法。显然,如果你只是想核爆应用程序的所有prefs,那么上面发布的其他方法之一是最有效的。
如果需要重置的应用程序设置是nsuserdefault访问麦克风(我的情况),一个简单的解决方案是安东尼麦考密克(如何启用应用程序访问设备上的媒体?- ALAssetsLibraryErrorDomain Code=-3312 "全局拒绝访问")的答案。
>常规>复位>复位位置警告
所有以上的答案都是非常相关的,但如果有人仍然无法重置用户默认删除的应用程序,那么你可以重置模拟器的内容设置,它将工作。
我发现了这个:
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
以下是Swift的答案:
let appDomain = NSBundle.mainBundle().bundleIdentifier! NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
注意:Swift也更新了这个答案。
把它写在一行上怎么样?
扩展@Christopher Rogers的回答——公认的答案。
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
是的,有时候你可能需要synchronize它,
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()
这是一个错误,但在清除所有NSUserDefaults值时,removePersistentDomainForName不工作。
removePersistentDomainForName
所以,更好的选择是重置PersistentDomain,你可以通过以下方式来做:
PersistentDomain
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
迅速:
let defaults = NSUserDefaults.standardUserDefaults() defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
我喜欢扩展,因为它能让代码更简洁:
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() } }
试试这个,对我很有效。
单行代码