web-dev-qa-db-ja.com

NSUserDefaultsの変更を検出する

最新のSDKを使用してiOSアプリケーションを開発しています。

NSUserDefaultsのプロパティが値を変更するタイミングを知りたい。

私は this を見つけましたが、それはmacOSに固有です:

[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
    forKeyPath:[@"values." stringByAppendingString: @"MyPreference"]
    options:NSKeyValueObservingOptionNew
    context:NULL];

iOSでこれを行うにはどうすればよいですか?

24
VansFannel

次のコードスニペットで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];
}
36
CarlJ

ユーザーデフォルトの変更に関する通知には、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 
{
    // 
}
21
Dmitry Vodianyk

これをSwift 4プロジェクトで使用する必要がある場合は、以下を使用できます。

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(defaultsChanged), name: UserDefaults.didChangeNotification, object: nil)
}

@objc func defaultsChanged() {
    // Your code
}
2
Josh

Xcodeのヘルプでは、UserDefaultsクラス(NSUserDefaultsの迅速な名前)の概要に次のように明記されています:

キー値監視を使用して、ローカルのデフォルトデータベースに対するすべての更新を通知するために、関心のある特定のキーのオブザーバーを登録できます。詳細については、Key-Value監視プログラミングガイドを参照してください。 "

簡単なコードサンプルを思い付くかどうかを確認しますが、SwiftではスタックオーバーフローでKVOサンプルをいっぱいにする必要があります。

1
Motti Shneor

Swiftでこれを行う方法について私が投稿したソリューションであり、userInfoも取得します。

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

1
Joseph