web-dev-qa-db-ja.com

NSUserDefaults辞書iOSからすべてのキーを削除する

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 enablebooleansintegersobjectsなどを保存するため、他の多くのものを保存することです。 NSUserDefaultsがアプリを起動する最初の時間のようになるためのすべてのキー

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

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

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

編集:

私が試してみました :

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

そして、私はまだハイスコアを取得することができます....

62
Tono Nam

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

- (void)resetDefaults {
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}
145
Alex Nichol

同じ結果でこれを行う最も簡単な方法 Alex Nicholのトップアンサーのように:

NSString *appDomain = NSBundle.mainBundle.bundleIdentifier;
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];
70
skywinder

ワンライナー:

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:NSBundle.mainBundle.bundleIdentifier];
44
Cameron E

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

目的C:

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

In Swift 3.0:

if let appDomain = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
24
Sourabh Sharma

Swiftバージョン:

if let bid = NSBundle.mainBundle().bundleIdentifier {
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   
16
superarts.org

+ (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操作の最後では、ユーザーのデフォルトのディスクコピーとメモリコピーの両方に、アプリケーションで設定された値は含まれません。

16
darvids0n

テストターゲットでこれを行いたい人のために、これを使用します(removePersistentDomainはそのケースでは機能しないため)

スウィフト3:

for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
     UserDefaults.standard.removeObject(forKey: key)
}
9
bogen

SwiftのOneliner:

Swift

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

Swift 4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
8
netshark1000

For Swift 3:3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
5
Taichi Kato

Swift= 3:

if let bundle = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundle)
}
5
Jay Mehta

Swift

 func resetUserDefaults(){

    let userDefaults = NSUserDefaults.standardUserDefaults()
    let dict = userDefaults.dictionaryRepresentation() as NSDictionary

    for key in dict.allKeys {

            userDefaults.removeObjectForKey(key as! String)
    }

    userDefaults.synchronize()

}
2
Dhananjay Patil

スイフト
ロジックに配置

if let appDomain = Bundle.main.bundleIdentifier {
       UserDefaults.standard.removePersistentDomain(forName: appDomain)
     }
2
Sai kumar Reddy

Swift 3または4記述されたスニペットをこの最新の表現に単純化することもできます:

func clearAll() {
    let settingsDictionary = userDefaults.dictionaryRepresentation()
    settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) }
    userDefaults.synchronize()
}
1
Dzmitry Chyrta

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

_+ (void)resetStandardUserDefaults
_

NSUserDefaultsのドキュメントから:

resetStandardUserDefaults

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

+ (void)resetStandardUserDefaults

ディスカッション

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

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

_[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];
_

これでデフォルトがリセットされます。

1
PengOne

Swift(最新の構文))のすべてのUserDefault値を削除するには

//remove UserDefaults
  if let identifier = Bundle.main.bundleIdentifier {
      UserDefaults.standard.removePersistentDomain(forName: identifier)
      UserDefaults.standard.synchronize()
  }
0
Hardik Thakkar