Disons que j'ai une clé @ "MyPreference", avec une valeur correspondante stockée dans NSUserDefaults.
Y a-t-il un moyen d'être notifié lorsque la valeur est modifiée?
Ou pourrait-il être fait à travers des liaisons? (Mais dans ce cas, au lieu de lier la valeur à un élément d'interface utilisateur, je souhaite que mon objet soit informé de la modification afin que je puisse effectuer d'autres tâches.)
Je suis conscient que NSUserDefaultsDidChangeNotification peut être observé, mais cela semble être une approche tout-ou-rien, et il ne semble pas y avoir de mécanisme permettant d'obtenir la paire clé-valeur spécifique qui a été modifiée. (N'hésitez pas à corriger.)
J'ai passé toute la journée à chercher la réponse, seulement 10 minutes après avoir posé la question ...
Entré dans une solution par Key-Value-Observing:
[[NSUserDefaultsController sharedUserDefaultsController] addObserver:self
forKeyPath:@"values.MyPreference"
options:NSKeyValueObservingOptionNew
context:NULL];
Ou plus simplement (par commentaire ci-dessous):
[[NSUserDefaults standardUserDefaults] addObserver:self
forKeyPath:@"MyPreference"
options:NSKeyValueObservingOptionNew
context:NULL];
Rapide:
override func viewDidLoad() {
super.viewDidLoad()
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "THE KEY", options: NSKeyValueObservingOptions.New, context: nil)
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
// your logic
}
deinit {
NSUserDefaults.standardUserDefaults().removeObserver(self, forKeyPath: "THE KEY")
}
Et les employés Apple ont conseillé d'utiliser la notification NSUserDefaultsDidChangeNotification ici: https://devforums.Apple.com/message/237718#237718
Je suis d'accord avec @DenNukem. J'utilisais le NSKeyValueObservingOptionNew. Mais cette fonction a commencé à me donner l'erreur BADACCESS Code = 1 partout où j'ai utilisé NSUserdefault afin de sauvegarder d'autres objets. Si vous utilisez Key Value Observer, tenez compte du problème de Zombie sur NSUserDefaults.
Voici le lien vers la solution: NSUserDefaults and KVO issues