web-dev-qa-db-ja.com

iOSで設定がいつ変更されるかを判断する方法

IPhone用の標準のroot.plistアプローチを使用してカスタムSettings.appバンドルを作成しました。ユーザーがアプリでこれらの設定をいつ変更したかを判断する方法があるかどうか疑問に思っています...

27
Ben

これでNSUSerDefaultsDidChange-notificationsをリッスンできます。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(defaultsChanged) name:NSUserDefaultsDidChangeNotification object:nil];

NSUserDefaultsが変更されるたびに、defaultsChangedが呼び出されます。

これらの通知のリッスンを停止する場合は、[[NSNotificationCenter defaultCenter] removeObserver:self];を呼び出すことを忘れないでください(オブジェクトの割り当てが解除されたときにもこれを行う必要があります)

39
Emil

構文は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
    }
}
11
Joseph

登録して NSUserDefaultsDidChangeNotification 通知を受信します。明らかではありませんが、 iOSアプリケーションプログラミングガイド はそれを次のように説明しています。

設定アプリケーションを介してアプリケーションが公開する設定が変更されます

7
Kris Markel

キー「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")
        }
    }
}
2

設定の変更を聞く

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(someMethod:) name:NSUserDefaultsDidChangeNotification object:nil];

このViewControllerがメモリになくなったら、オブザーバーを削除することを忘れないでください。

1
iosCurator