Pour commencer avec les liaisons, j'écris une petite application qui convertit la température en degrés Celsius en température en Kelvin et vice-versa.Notifier un observateur - Premiers pas avec les liaisons
J'ai deux NSTextFields qui sont liés à deux propriétés connues comme float kelvin
et float centigrade
. Et, bien sûr, j'ai deux setters personnalisés qui définissent la valeur de chaque propriété de manière appropriée.
Le poseur de celsius est:
centigrade = value;
[self willChangeValueForKey:@"kelvin"];
kelvin = value + 273;
[self didChangeValueForKey:@"kelvin"];
-je utiliser willChangeValueForKey:
sinon la valeur est pas mis à jour dans l'autre NSTextField.
Ma question est, y at-il une façon plus élégante de faire cela? Si j'ajoute une autre propriété et textfield pour convertir la température en Fahrenheit, je devrais ajouter willChange...
et didChange...
dans ce getter aussi bien.
Y at-il un moyen de dire au fichier nib que ces deux propriétés sont liées et chaque fois que l'on change, il doit en aviser les deux observateurs?
EDIT:
Pour ce que ça vaut, je l'ai essayé d'appeler le poseur de kelvin à l'intérieur du poseur de centigrades. Mais si je fais cela aussi dans le setter pour kelvins, cela ne causerait-il pas de problèmes? Par exemple:
centigrade = value;
[self setKelvin:value];
et
kelvin = value;
[self setCelsius:value];
Je me sentais complètement hors de propos. Je devine que je dois rendre mon modèle KVO conforme et juste avoir deux propriétés de flotteur ne va pas le couper? De plus, vous déclarez que je n'ai pas du tout besoin de setters personnalisés - n'aurai-je pas besoin de code pour convertir les kelvins en celsius et vice-versa? – saad
Je viens aussi de surcharger + keyPathsForValuesAffectingValueForKey et cela semble fonctionner aussi bien. Mais je tiens toujours à ce que vous avez dit sur le modèle. FWIW, j'ai un modèle primitif mais si je supprime les accesseurs personnalisés cela ne change évidemment pas la température mais les valeurs mais les setters/getters synthétisés sont encore appelés ofcourse et les valeurs sont mises à jour. J'ai confirmé en connectant deux champs de texte à la même propriété et en changeant l'un met à jour l'autre. – saad
J'ai ajouté un peu plus d'explications. Le point sur le modèle n'est pas vraiment que vous avez besoin d'un modèle complexe, juste qu'il est bon de le développer indépendamment de vos vues, de préférence avec des tests unitaires :) – hooleyhoop