2011-04-19 11 views
6

Estoy usando NSUserDefaults en mi aplicación y me gustaría recibir notificaciones cuando se cambie un valor en particular. Por eso, he añadido las siguientes líneas en viewDidLoad:NSUserDefaults and KVO issues

NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; 
[settings synchronize]; 
[settings addObserver:self forKeyPath:@"pref_server" options:NSKeyValueObservingOptionNew context:NULL]; 

y el método para ser notificado:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 

    NSLog(@"Change"); 

    NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; 
    if (object == settings && [keyPath isEqualToString:@"pref_server"]) 
    { 
     NSLog(@"Server did change"); 
    } 

} 

Por desgracia, éste nunca se llama ... @ "pref_server" es el identificador de elemento Lo configuré en Root.plist, en Settings.bundle. ¿Qué estoy haciendo mal?

Respuesta

16

Sugiero hacer uso de la notificación correspondiente: NSUserDefaultsDidChangeNotification.

Busque AppPrefs en la documentación de Apple en XCode y le mostrará una aplicación de ejemplo que hace exactamente lo que quiere hacer. ¡Solo compila y ejecuta! Hace uso del NSUserDefaultsDidChangeNotification.

Este es el código que se utiliza para registrar un observador:

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

muchas gracias, ahora funciona como un encanto :) – J0o0

+0

Para Swift3: 'NotificationCenter.default.addObserver (auto, \t selector: #selector (defaultsChanged), \t nombre: UserDefaults.didChangeNotification, \t objeto: nada) ' – Yohst

2

NSUserDefaults no es compatible con MVA, pero es NSUserDefaultsController. Así que tendría que utilizar:

NSUserDefaultsController *defaultsc = [NSUserDefaultsController sharedUserDefaultsController]; 
[defaultsc addObserver:self forKeyPath:@"values.pref_server" 
       options:NSKeyValueObservingOptionNew 
       context:NULL]; 
+12

NSUserDefaultsController no está disponible en Cocoa Touch para iOS. –

5

observación interesante:

[NSUserDefaults standardUserDefaults] parece ser compatible KVO ahora dado que soy capaz de observar y unirse a él es valores. Estoy ejecutando 10.7.2, usando Xcode 4.2, SDK 10.7, LLVM compiler 3. 0.

Parece que no puedo encontrar este nuevo comportamiento documentado en ninguna parte de las notas de la versión.

+1

Supongo que es un cambio no documentado en Lion. Las notas de la versión mencionan algunos cambios realizados por defecto, por lo que creo que el soporte de KVO cambió al mismo tiempo. La necesidad de utilizar el controlador para KVC/KVO está documentada en los Temas de programación de enlaces de cacao para Snow Leopard y Lion. –

+0

Esto también funciona bajo OS X 10.8 Mountain Lion. –

+3

La pregunta fue específicamente sobre [etiqueta: ios]. –

2

Aunque no está bien documentado, NSUserDefaults admite la observación de valores-clave en iOS7.

+0

Parece que no funciona en iOS9 – jeeeyul