IPhone用の標準のroot.plist
アプローチを使用してカスタムSettings.appバンドルを作成しました。ユーザーがアプリでこれらの設定をいつ変更したかを判断する方法があるかどうか疑問に思っています...
これでNSUSerDefaultsDidChange-notificationsをリッスンできます。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged) name:NSUserDefaultsDidChangeNotification object:nil];
NSUserDefaultsが変更されるたびに、defaultsChanged
が呼び出されます。
これらの通知のリッスンを停止する場合は、[[NSNotificationCenter defaultCenter] removeObserver:self];
を呼び出すことを忘れないでください(オブジェクトの割り当てが解除されたときにもこれを行う必要があります)
構文はSwift 2. Swiftを使用して、NSUserDefaultsの変更をサブスクライブするために次のようにします。
NSNotificationCenter.defaultCenter().addObserver(self, selector: "defaultsChanged:", name: NSUserDefaultsDidChangeNotification, object: nil)
次に、次のようなメソッドを作成します。
func defaultsChanged(notification:NSNotification){
if let defaults = notification.object as? NSUserDefaults {
//get the value for key here
}
}
登録して NSUserDefaultsDidChangeNotification
通知を受信します。明らかではありませんが、 iOSアプリケーションプログラミングガイド はそれを次のように説明しています。
設定アプリケーションを介してアプリケーションが公開する設定が変更されます
キー「instantWeb」を使用してアプリ固有のブール型設定にアクセスする例:
func observeUserDefaults(notification: NSNotification) {
print("Settings changed")
if let defaults = notification.object as? NSUserDefaults {
if defaults.valueForKey("instantWeb") as! Bool==true {
print("Instant Web ON")
}
}
}
Swift 4
ViewControllerにオブザーバーを登録します。
NotificationCenter.default.addObserver(self, selector: #selector(settingChanged(notification:)), name: UserDefaults.didChangeNotification, object: nil)
セレクターの実装
@objc func settingChanged(notification: NSNotification) {
if let defaults = notification.object as? UserDefaults {
if defaults.bool(forKey: "enabled_preference") {
print("enabled_preference set to ON")
}
else {
print("enabled_preference set to OFF")
}
}
}
設定の変更を聞く
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod:) name:NSUserDefaultsDidChangeNotification object:nil];
このViewControllerがメモリになくなったら、オブザーバーを削除することを忘れないでください。