292

+[NSUserDefaults standardUserDefaults]アプリケーション設定の保存に使用しています。これは、およそ12個の文字列値で構成されます。これらの値を単にデフォルト値に設定するのではなく、完全に削除することは可能ですか?

4

15 に答える 15

522

次のように、アプリケーションの永続ドメインを削除できます。

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

Swift 3 以降では:

if let bundleID = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundleID)
}

これは@samvermetteの回答に似ていますが、IMOが少しきれいです。

于 2011-07-26T02:55:23.017 に答える
103

このコードは、デフォルトを登録ドメインにリセットします。

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

つまり、removeObjectForKeyそのアプリに登録したすべてのキーに対してです。

このAppleDeveloperForumsスレッドのKenThomasesの功績。

于 2010-06-10T04:40:08.447 に答える
97

-使ってみましたremoveObjectForKeyか?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
于 2009-02-13T07:51:56.653 に答える
30

Swiftでの答えは次のとおりです。

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
于 2015-04-15T14:36:31.483 に答える
29

開発中に必要な場合は、シミュレーターをリセットして、すべてのNSUserDefaults.

iOS シミュレータ -> コンテンツと設定をリセット...

シミュレーター上のすべてのアプリとファイルも削除されることに注意してください。

于 2011-09-06T14:54:11.693 に答える
15
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
于 2014-01-20T03:56:32.257 に答える
7

コードをよりきれいにする拡張機能が大好きです。

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()
    }
}
于 2016-08-22T22:33:40.937 に答える
6

注: この回答は 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()
于 2015-08-11T06:02:53.333 に答える
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

于 2014-12-04T18:33:16.600 に答える
2

これはバグか何かですが、すべての値removePersistentDomainForNameをクリアしている間は機能しません。NSUserDefaults

したがって、より良いオプションは、をリセットするPersistentDomainことであり、次の方法で実行できます。

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
于 2016-03-09T08:28:05.430 に答える
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: を呼び出すと、より広い範囲に適用されるため、他の設定を含む可能性が高い辞書が返されます。

リセットする値を除外する必要がある場合は、キーを反復処理することがその方法です。明らかに、関係なくアプリのすべての設定を削除したい場合は、上記の他の方法の 1 つが最も効率的です。

于 2014-02-18T01:42:55.813 に答える
0

リセットが必要なアプリケーション設定がマイクへのアクセス用に nsuserdefault である場合 (私の場合)、簡単な解決策は Anthony McCormick からの回答です ( Iphone - デバイス上のメディアへのアプリケーション アクセスを有効にする方法 - ALAssetsLibraryErrorDomain Code=-3312 "Global denied access")。

デバイスで、[設定] > [一般] > [リセット] > [位置情報の警告をリセット] に移動します

于 2014-08-14T23:15:20.577 に答える