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
、booleans
、integers
、objects
などを保存するため、他の多くのものを保存することです。 NSUserDefaultsがアプリを起動する最初の時間のようになるためのすべてのキー
私は次のようなものを探しています:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];
または、すべてのキーを取得する方法があり、各オブジェクトをループする必要がありますが、それらを削除する方法がわかりません。
編集:
私が試してみました :
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];
そして、私はまだハイスコアを取得することができます....
NSUserDefaults documentation を見ると、メソッド- (NSDictionary *) dictionaryRepresentation
が表示されます。標準のユーザーデフォルトでこの方法を使用すると、ユーザーデフォルトのすべてのキーのリストを取得できます。次に、これを使用してユーザーのデフォルトをクリアできます。
- (void)resetDefaults {
NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
NSDictionary * dict = [defs dictionaryRepresentation];
for (id key in dict) {
[defs removeObjectForKey:key];
}
[defs synchronize];
}
同じ結果でこれを行う最も簡単な方法 Alex Nicholのトップアンサーのように:
NSString *appDomain = NSBundle.mainBundle.bundleIdentifier;
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];
ワンライナー:
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:NSBundle.mainBundle.bundleIdentifier];
シンプルなソリューション
目的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)
}
Swiftバージョン:
if let bid = NSBundle.mainBundle().bundleIdentifier {
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}
+ (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
操作の最後では、ユーザーのデフォルトのディスクコピーとメモリコピーの両方に、アプリケーションで設定された値は含まれません。
テストターゲットでこれを行いたい人のために、これを使用します(removePersistentDomain
はそのケースでは機能しないため)
スウィフト3:
for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
UserDefaults.standard.removeObject(forKey: key)
}
SwiftのOneliner:
Swift
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)
Swift 4
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
For Swift 3:3:
let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
Swift= 3:
if let bundle = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundle)
}
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()
}
スイフト
ロジックに配置
if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
Swift 3または4記述されたスニペットをこの最新の表現に単純化することもできます:
func clearAll() {
let settingsDictionary = userDefaults.dictionaryRepresentation()
settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) }
userDefaults.synchronize()
}
このメソッドはそれをしませんか:
_+ (void)resetStandardUserDefaults
_
NSUserDefaults
のドキュメントから:
resetStandardUserDefaults
共有ユーザーのデフォルトオブジェクトに加えられた変更を同期し、メモリから解放します。
+ (void)resetStandardUserDefaults
ディスカッション
その後のstandardUserDefaultsの呼び出しにより、標準の検索リストを使用して新しい共有ユーザーのデフォルトオブジェクトが作成されます。
これに基づいて、次のことができます。
_[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];
_
これでデフォルトがリセットされます。
Swift(最新の構文))のすべてのUserDefault値を削除するには
//remove UserDefaults
if let identifier = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: identifier)
UserDefaults.standard.synchronize()
}