iOS NSUserDefaults Regarder le changement de valeurs pour une touche unique
J'ai le code suivant visant à attraper le cas de NSUserDefaults la modification de la valeur pour une clé spécifique.
[[NSUserDefaults standardUserDefaults] addObserver:self
forKeyPath:SOME_NSSTRING_VARIABLE
options:NSKeyValueObservingOptionNew
context:NULL];
- (void)observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context
{NSLog (@"Changed for key %@", keyPath); }
Mais la observeValueForKeyPath n'est jamais appelé. J'ai même essayé de remplacer le SOME_NSSTRING_VARIABLE trop avec une chaîne comme mentionné dans En observant les changements de valeur d'un NSUserDefaults clé mais cela n'a pas aidé.
Mise à jour:
Je suis l'évolution du NSUserDefaults à partir d'un tabview. Le code ci-dessus afin de surveiller les changements se trouve dans un autre onglet de la même tabviewcontroller. Dans l'onglet où je surveiller les changements (de l'onglet où le code ci-dessus), si j'en ajoute un :
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// NSLog(@"viewillappear");
NSUserDefaults *FUDefaults = [NSUserDefaults standardUserDefaults];
NSLog(@"The username obtained is: %@", [FUDefaults objectForKey:SOME_NSSTRING_VARIABLE]);
}
la mise à jour NSUserDefaults valeur est obtenue correctement, mais le observeValueForKeyPath n'a jamais été appelée.
Aussi, je considérerai que vous avez
[[NSUserDefaults standardUserDefaults] addObserver...
à l'intérieur de viewDidLoad
?NSUserDefaults *FDefaults = [NSUserDefaults standardUserDefaults]; [FDefaults setObject:nom d'utilisateur.texte forKey:SOME_NSSTRING_VARIABLE]; [[NSUserDefaults standardUserDefaults] synchroniser];
Oui, j'ai le addObserver... à l'intérieur de la fonction viewDidLoad
OriginalL'auteur Sankar | 2012-05-28
Vous devez vous connecter pour publier un commentaire.
Edit:
viewDidUnload
est maintenant obsolète, utilisezdealloc
au lieu deremoveObserver
Cela devrait fonctionner parfaitement, je l'ai juste testé ici.
Choses que vous pourriez tester.
Mettre un point de rupture dans viewDidUnload et assurez-vous que le point de vue n'est pas en train de disparaître sur vous (puisque vous changez
SomeKey
à partir d'un autre viewController) Si c'est le cas, alors peut-être déplacer votre enregistrer/désenregistrer code dans init/dealloc selon la façon dont votre VC oeuvres.Utilisation explicite de chemin d'accès clé comme
@"SomeKey"
pas une substitution commeSOME_NSSTRING_VARIABLE
viewDidUnload est maintenant obsolète, utilisez dealloc au lieu de removeObserver
Oui, les choses ont changé maintenant
OriginalL'auteur trapper
Swift 3 Version:
OriginalL'auteur chriswillow
Swift Version:
OriginalL'auteur fede1608