我正在使用+[NSUserDefaults standardUserDefaults]
来存储应用程序设置。这包含大约十几个字符串值。是否可以永久删除这些值而不是仅将它们设置为默认值?
答案 0 :(得分:505)
您可以删除应用程序的持久域,如下所示:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
在Swift 3及更高版本中:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
这类似于@samvermette的答案,但IMO有点清洁。
答案 1 :(得分:102)
此代码将默认值重置为注册域:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
换句话说,对于您在该应用中注册的每一个密钥,它都是removeObjectForKey
。
在此Apple开发者论坛上致Ken Thomases的信用thread.
答案 2 :(得分:96)
您是否尝试过使用 - removeObjectForKey
?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
答案 3 :(得分:30)
以下是Swift的答案:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
答案 4 :(得分:28)
如果您在开发时需要它,您还可以重置模拟器,删除所有NSUserDefaults
。
iOS模拟器 - >重置内容和设置...
请记住,它还会删除模拟器上的所有应用和文件。
答案 5 :(得分:14)
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
答案 6 :(得分:7)
在斯威夫特:
nil
答案 7 :(得分: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
答案 8 :(得分: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];
}
<强>夫特强>
随着快速变得更容易。
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
self.standard.removePersistentDomain(forName: aValidIdentifier)
self.standard.synchronize()
}
}
使用情况:
UserDefaults.clean()
答案 9 :(得分:5)
我喜欢扩展,因为他们使代码更清晰:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
答案 10 :(得分:2)
以上所有答案都非常相关,但是如果有人仍然无法重置已删除应用的用户默认设置,那么您可以重置模拟器的内容设置,它会起作用。
答案 11 :(得分:2)
这是一个错误或其他问题,但removePersistentDomainForName
在清除所有NSUserDefaults
值时无效。
所以,更好的选择是重置PersistentDomain
,你可以通过以下方式做到:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
答案 12 :(得分: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];
}
...调用NSUserDefault的persistentDomainForName:方法。正如文档所述,方法“返回包含指定持久域中的键和值的字典”。调用dictionaryRepresentation:相反,将返回一个字典,该字典可能包含适用于更广范围的其他设置。
如果您需要过滤掉任何要重置的值,那么迭代键就可以了。显然,如果你想不考虑应用程序的所有prefs,那么上面发布的其他方法之一是最有效的。
答案 13 :(得分:0)
如果需要重置的应用程序设置是nsuserdefault来访问麦克风(我的情况),一个简单的解决方案是Anthony McCormick(Iphone - How to enable application access to media on the device? - ALAssetsLibraryErrorDomain Code=-3312 "Global denied access")的答案。
在设备上,转到设置&gt;常规&gt;重置&gt;重置位置警告
答案 14 :(得分:0)
试试这个,这对我有用。
单行代码
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];