Ton*_*lon 282 cocoa-touch objective-c nsuserdefaults ios
我正在+[NSUserDefaults standardUserDefaults]用来存储应用程序设置.这包含大约十几个字符串值.是否可以永久删除这些值而不是仅将它们设置为默认值?
Chr*_*ers 509
您可以删除应用程序的持久域,如下所示:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Run Code Online (Sandbox Code Playgroud)
在Swift 3及更高版本中:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Run Code Online (Sandbox Code Playgroud)
这类似于@samvermette的答案,但IMO有点清洁.
sam*_*tte 102
此代码将默认值重置为注册域:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Run Code Online (Sandbox Code Playgroud)
换句话说,它removeObjectForKey适用于您在该应用中注册的每一个键.
在此Apple开发者论坛主题上向Ken Thomases致信.
sbo*_*oth 96
你尝试过使用removeObjectForKey吗?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Run Code Online (Sandbox Code Playgroud)
jul*_*aad 30
这是Swift的答案:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Run Code Online (Sandbox Code Playgroud)
Rog*_*oli 28
如果你在开发时需要它,你也可以重置你的模拟器,删除所有NSUserDefaults.
iOS模拟器 - >重置内容和设置...
请记住,它还将删除模拟器上的所有应用程序和文件.
fol*_*lse 14
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Run Code Online (Sandbox Code Playgroud)
在Swift中:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Run Code Online (Sandbox Code Playgroud)
我找到了这个:
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 "{}"
Run Code Online (Sandbox Code Playgroud)
资料来源:https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
注意:此答案也已针对Swift进行了更新.
怎么把它放在一条线上?
延伸@Christopher Rogers的答案 - 接受的答案.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Run Code Online (Sandbox Code Playgroud)
是的,有时你可能需要synchronize它,
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)
我创建了一个方法来做到这一点,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特?
随着迅捷,它变得更加容易.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
UserDefaults.clean()
Run Code Online (Sandbox Code Playgroud)
当他们使代码更清洁时,我喜欢扩展:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
123701 次 |
| 最近记录: |