75

NSUserDefaults ディクショナリを使用してハイスコアなどの基本情報を保存し、ユーザーがアプリを閉じてもデータが失われないようにします。とにかく私は使用します:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

データを保存します。たとえば、新しいハイスコアを保存したい場合は、次のようにします。

[prefs setInteger:1023 forKey:@"highScore"];
[prefs synchronize];  //this is needed in case the app is closed. 

後でハイスコアを取得したい場合は、次のようにします。

[prefs integerForKey:@"highScore"];

とにかく、ポイントは、あなたが保存するため、他の多くのものを保存することですNSUserDefaults enable.など. すべてのキーを削除して、NSUserDefaults がアプリを起動した最初の時間のようになるようにするには、どのメソッドを実行する必要がありますか?booleansintegersobjects

私は次のようなものを探しています:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];

または、すべてのキーを取得する方法があり、各オブジェクトをループする必要がありますが、それらを削除する方法がわかりません。

編集:

私が試してみました :

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];

それでもハイスコアを取り出せる…。

4

18 に答える 18

149

NSUserDefaults のドキュメントを見ると、メソッドが表示されます- (NSDictionary *) dictionaryRepresentation。標準のユーザー デフォルトでこのメソッドを使用すると、ユーザー デフォルトのすべてのキーのリストを取得できます。これを使用して、ユーザーのデフォルトをクリアできます。

- (void)resetDefaults {
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}
于 2011-07-22T23:24:35.350 に答える
73

Alex Nicholのトップアンサーと同じ結果でこれを行う最短の方法:

NSString *appDomain = NSBundle.mainBundle.bundleIdentifier;
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];
于 2013-09-19T10:59:56.527 に答える
45

一発ギャグ:

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:NSBundle.mainBundle.bundleIdentifier];
于 2014-07-12T04:07:04.807 に答える
31

シンプルなソリューション

目標 C:

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

Swift 3.0 から Swift 5.0 :

if let appDomain = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
于 2016-10-14T09:27:44.180 に答える
16

迅速なバージョン:

if let bid = NSBundle.mainBundle().bundleIdentifier {
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   
于 2015-03-18T04:24:31.767 に答える
16

+ (void) resetStandardUserDefaults変更を永続化するのではなく、メモリ内のユーザー デフォルト オブジェクトをリセットするだけで、synchronize既存のメモリ内の値をディスク上のバージョンで上書きするのではなく、次の呼び出しがディスク上のコピーから読み取られるようになります。

キーを反復する方が良いですが、実際にはこれを行う関数があります: removePersistentDomainForName:.

// you can usually get the domain via [[NSBundle mainBundle] bundleIdentifier]
[[NSUserDefaults standardUserDefaults]
 removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
// or use a string for any other settings domains you use
//[[NSUserDefaults standardUserDefaults]
// removePersistentDomainForName:@"com.mycompany.myappname"];
[[NSUserDefaults standardUserDefaults] synchronize];

操作の最後に、synchronizeユーザー デフォルトのディスク コピーとメモリ コピーの両方に、アプリケーションによって設定された値は含まれません。

于 2012-05-27T03:51:45.930 に答える
11

スウィフトのワンライナー:

スイフト3

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)

スイフト4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
于 2016-05-22T10:40:13.807 に答える
5

スウィフト 3 の場合:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
于 2016-11-27T08:41:01.360 に答える
2

あなたの論理の迅速な場所

if let appDomain = Bundle.main.bundleIdentifier {
  UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
于 2018-09-06T10:30:39.407 に答える
1

このメソッドはそれを行いませんか:

+ (void)resetStandardUserDefaults

のドキュメントからNSUserDefaults:

resetStandardUserDefaults

共有ユーザー デフォルト オブジェクトに加えられたすべての変更を同期し、メモリから解放します。

+ (void)resetStandardUserDefaults

討論

続いて standardUserDefaults を呼び出すと、標準検索リストを使用して新しい共有ユーザー デフォルト オブジェクトが作成されます。

これに基づいて、次のことができます。

[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];

これで、デフォルトをリセットする必要があります。

于 2011-07-22T23:20:46.117 に答える
1

コードを の拡張機能に配置するのが最も便利であることがわかりましたUserDefaults

スイフト5

extension UserDefaults {
    static func clear() {
        guard let domain = Bundle.main.bundleIdentifier else { return }
        UserDefaults.standard.removePersistentDomain(forName: domain)
        UserDefaults.standard.synchronize()
    }
}

使用法

UserDefaults.clear()
于 2020-08-06T15:53:17.363 に答える