NSUserDefaultsDidChangeNotification: Quel est le nom De la Clé, qui a Changé?
Ce code va appeler la méthode "defaultsChanged", lorsque la valeur en UserDefaults changé
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(defaultsChanged:)
name:NSUserDefaultsDidChangeNotification
object:nil];
Ce Code va me donner la VALEUR que modifié
- (void)defaultsChanged:(NSNotification *)notification {
//Get the user defaults
NSUserDefaults *defaults = (NSUserDefaults *)[notification object];
//Do something with it
NSLog(@"%@", [defaults objectForKey:@"nameOfThingIAmInterestedIn"]);
}
mais comment puis-je obtenir le NOM de la clé, qui a changé??
OriginalL'auteur smudo78 | 2012-06-03
Vous devez vous connecter pour publier un commentaire.
Que d'autres ont dit, il n'existe aucun moyen d'obtenir de l'information à propos de la modification de la clé de la NSUserDefaultsDidChange de Notification. Mais il n'est pas nécessaire de dupliquer le contenu et vérifiez par vous-même, parce qu'il n'y est Valeur de la Clé de l'Observation (KVO) qui travaille également avec le NSUserDefaults, si vous avez besoin de spécifiquement être averti d'une certains biens:
D'abord, inscrivez-vous pour KVO au lieu d'utiliser le NotificationCenter:
n'oubliez pas de retirer de l'observation (par exemple, dans viewDidUnload ou dealloc)
et enfin de mettre en œuvre cette méthode pour recevoir KVO notifications
dans ce cas précis, vous pouvez encore ajouter l'habitude NSUserDefaultsDidChangeNotification
les choses changent constamment: dans iOS 6 viewDidUnload est obsolète. On devrait utiliser (void)didReceiveMemoryWarning à la place. Et merci pour votre message 😉
merci pour l'astuce. C'est pourquoi j'ai écrit "par exemple, dans viewDidUnload ou dealloc". -didReceiveMemoryWarning n'est pas le meilleur choix car il ne pourrait jamais être appelé, quand il n'y a aucun avertissement de mémoire faible. Pour iOS6, le meilleur endroit est dealloc.
Ne fonctionne pas sur Mac.
OriginalL'auteur auco
Il n'existe pas de données fournies dans la notification du
userInfo
dictionnaire, il semble que vous êtes hors de la chance, sauf si vous souhaitez conserver une copie des données stockées dansNSUserDefaults
ailleurs et d'effectuer un diff sur les deux dictionnaires.Comme je l'ai dit, vous pouvez garder un clone de données stockées dans
NSUserDefaults
ailleurs et de comparer les deux dictionnaires de voir ce qui a changé.OriginalL'auteur Jacob Relkin
Utilisation des notifications personnalisées pour déterminer exactement ce qui s'est passé, par exemple:
Si elle n'est pas une option avec userDefaults, puis il suffit de lire tous les paramètres utilisateur par défaut chaque fois que vous obtenez votre
NSUserDefaultsDidChangeNotification
de notification et de compair avec les précédentes.OriginalL'auteur Maxim Mikheev
juste ajouter
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:nil];
à votre
appDidBecomeActive
méthode, puis ajouter[
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(settingsChangedListener) name:NSUserDefaultsDidChangeNotification object:nil];
à votre
applicationDidEnterBackground
ensuite utiliser KVO observateur, comme indiqué ci-dessus, lorsque dans le premier plan
OriginalL'auteur j2emanue
Vous pouvez utiliser
dictionaryRepresentation
pour obtenir une copie intégrale deNSUserDefaults
commeNSDictionary
. Puis c'est une question de comparer des valeurs anciennes et les nouvelles valeurs.NSUserDefaults
n'est pas KVO conforme, le fait qu'il peut s'en tirer KVO notifications ne doivent pas être invoqué et est sujet à changement apparemment.Par exemple:
OriginalL'auteur highmaintenance