+[NSUserDefaults standardUserDefaults]
アプリケーション設定の保存に使用しています。これは、およそ12個の文字列値で構成されます。これらの値を単にデフォルト値に設定するのではなく、完全に削除することは可能ですか?
15 に答える
次のように、アプリケーションの永続ドメインを削除できます。
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
そのアプリに登録したすべてのキーに対してです。
このAppleDeveloperForumsスレッドのKenThomasesの功績。
-使ってみましたremoveObjectForKey
か?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Swiftでの答えは次のとおりです。
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
開発中に必要な場合は、シミュレーターをリセットして、すべてのNSUserDefaults
.
iOS シミュレータ -> コンテンツと設定をリセット...
シミュレーター上のすべてのアプリとファイルも削除されることに注意してください。
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
コードをよりきれいにする拡張機能が大好きです。
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()
}
}
注: この回答は Swift についても更新されています。
1行にするとどうなりますか?
@Christopher Rogers の回答を拡張する – 受け入れられたもの。
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
はい、いつか必要にsynchronize
なるかもしれませんが、
[[NSUserDefaults standardUserDefaults] synchronize];
これを行うメソッドを作成しました。
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
スイフト?
Swift を使用すると、さらに簡単になります。
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
と使用法:
UserDefaults.clean()
私はこれを見つけました:
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];
}
... NSUserDefault の persistentDomainForName: メソッドを呼び出します。ドキュメントの状態として、メソッドは「指定された永続ドメインのキーと値を含む辞書を返します。」代わりに、 DictionaryRepresentation: を呼び出すと、より広い範囲に適用されるため、他の設定を含む可能性が高い辞書が返されます。
リセットする値を除外する必要がある場合は、キーを反復処理することがその方法です。明らかに、関係なくアプリのすべての設定を削除したい場合は、上記の他の方法の 1 つが最も効率的です。
リセットが必要なアプリケーション設定がマイクへのアクセス用に nsuserdefault である場合 (私の場合)、簡単な解決策は Anthony McCormick からの回答です ( Iphone - デバイス上のメディアへのアプリケーション アクセスを有効にする方法 - ALAssetsLibraryErrorDomain Code=-3312 "Global denied access")。
デバイスで、[設定] > [一般] > [リセット] > [位置情報の警告をリセット] に移動します