最新のSDKを使用してiOSアプリケーションを開発しています。
NSUserDefaults
のプロパティが値を変更するタイミングを知りたい。
私は this を見つけましたが、それはmacOSに固有です:
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
forKeyPath:[@"values." stringByAppendingString: @"MyPreference"]
options:NSKeyValueObservingOptionNew
context:NULL];
iOSでこれを行うにはどうすればよいですか?
次のコードスニペットでNSUserDefaultsDidChangeNotification
を試してください:
- (id)init {
self = [super init];
if(self) {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(defaultsChanged:)
name:NSUserDefaultsDidChangeNotification
object:nil];
}
return self;
}
- (void)defaultsChanged:(NSNotification *)notification {
// Get the user defaults
NSUserDefaults *defaults = (NSUserDefaults *)[notification object];
NSLog(@"%@", [defaults objectForKey:@"yourIntrestedObject"]);
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
ユーザーデフォルトの変更に関する通知には、NSUserDefaultsDidChangeNotificationを使用します。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(defaultsDidChange:) name:NSUserDefaultsDidChangeNotification
object:nil];
// notification
- (void)defaultsDidChange:(NSNotification *)aNotification
{
//
}
ユーザーデフォルトの特定の変更に関する通知にはKVOを使用します。
[[NSUserDefaults standardUserDefaults] addObserver:self
forKeyPath:@"APXMyPropertyIamInterestedInKey" options:NSKeyValueObservingOptionNew
context:NULL];
// KVO handler
-(void)observeValueForKeyPath:(NSString *)aKeyPath ofObject:(id)anObject
change:(NSDictionary *)aChange context:(void *)aContext
{
//
}
これをSwift 4プロジェクトで使用する必要がある場合は、以下を使用できます。
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(defaultsChanged), name: UserDefaults.didChangeNotification, object: nil)
}
@objc func defaultsChanged() {
// Your code
}
Xcodeのヘルプでは、UserDefaults
クラス(NSUserDefaults
の迅速な名前)の概要に次のように明記されています:
キー値監視を使用して、ローカルのデフォルトデータベースに対するすべての更新を通知するために、関心のある特定のキーのオブザーバーを登録できます。詳細については、Key-Value監視プログラミングガイドを参照してください。 "
簡単なコードサンプルを思い付くかどうかを確認しますが、SwiftではスタックオーバーフローでKVOサンプルをいっぱいにする必要があります。
Swiftでこれを行う方法について私が投稿したソリューションであり、userInfoも取得します。