Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Mac

Mac Avant de poster: Lire La FAQ Mac; Voir la page Outils; Voir les tutoriels.

Réponse
 
Outils de la discussion
Vieux 01/08/2008, 10h55   #1 (permalink)
Membre régulier
 
Date d'inscription: février 2004
Messages: 125
Envoyer un message via AIM à Omfraax Envoyer un message via MSN à Omfraax
Par défaut [Cocoa]Bindings et KVC/KVO

Bonjour à tous.
J'ai essayé de comprendre les Bindings sous Cocoa, j'ai même réussi à en implémenter dans une application mais un truc me chiffonne dans le tutorial proposé par Apple (C'est le Currency Converter avec bindings).

Ce que je ne comprends pas, c'est pourquoi ils n'ont pas besoin d'implementer des accessors (notamment les méthodes set...) pour
Code :
double dollarsToConvert;
double exchangeRate;
définis dans la classe Converter ?

Dites-moi si j'ai bien tout compris dans le cheminement :

Pour moi, quand l'utilisateur change ces valeurs depuis l'interface (donc execute indirectement un setFloatValue: sur les champs correspondants), le binding avertit le Controller qui lui-même fait executer une setValue à l'objet qu'il contrôle (ici, une instance de Converter)

Merci d'avance !
Omfraax est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/08/2008, 19h02   #2 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: avril 2008
Messages: 21
Par défaut

En ce qui concerne les bindings, je trouve ce mécanisme très déroutant alors que l'objectif se résume aux trois points suivants:

• Transférer les données du modèle vers la vue et réciproquement,
• Automatiser l'archivage du modèle.
• Gérer certaines intéractions de l'utilisateur.

Pour revenir à ta question, les connexions sont établient au niveau d'IB, à la section "Binding Views to Controllers".
Les données sont mémorisées dans le modèle à l'aide d'un tableau associatif (NSMutableDictionary).
D'autre part, le K.V.O n'a pas systématiquement besoin de méthodes d'accès. A défaut, il accède directement à la donnée membre. Cet accès n'est pas autorisé par le programmeur et c'est le compilateur qui construit l'appel. En effet, on ne peut par exemple écrire:

double value = [object dollarsToConvert];

En fait, il calcule l'adresse de la donnée membre simplement en ajoutant l'adresse de l'objet à l'adresse relative de la donnée membre en question.
Les adresses relatives sont calculée depuis une adresse fictive 0. Ainsi, l'adresse de la prochaine donnée membre est obtenue en ajoutant la taille et l'adresse de la donnée membre précédente. C'est plus rapide qu'un appel de méthode mais ce n'est pas conseillé dans le cadre de la programmation orientée objet !

J'espère avoir répondu à tes questions.

@+

Je développe un outil R.A.D autour de Cocoa et d'un Pascal orienté objet. Je suis en train d'écrire un système (Core Model) plus simple qui répondra au trois points cités plus haut.
XDev1 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 05/08/2008, 21h59   #3 (permalink)
Membre régulier
 
Date d'inscription: février 2004
Messages: 125
Envoyer un message via AIM à Omfraax Envoyer un message via MSN à Omfraax
Par défaut

Merci pour ces éléments de réponse.

Si j'ai bien suivi, tant que c'est l'interface qui va commander (donc in quand l'utilisateur entre quelque chose dans un champ), les modifications sont répercutées "toutes seules" dans le modèle et sont KVC-compliant.

Mais dès que dans le programme, on veut nous même modifier une variable du modèle et que cela apparaisse dans l'interface, alors on doit déclarer un setter et modifier cette variable avec cette méthode d'accès ?

J'ai bon ?
Omfraax est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/08/2008, 14h20   #4 (permalink)
Candidat au titre de Membre du Club
 
Date d'inscription: avril 2008
Messages: 21
Par défaut

Tout est expliqué dans la doc. En effet, du modèle vers la vue, la liaison est effectuée au niveau d'IB. On connecte ainsi le contrôle à une donnée membre du modèle. Il faut dans ce cas appliquer un formatteur pour que le type de la valeur du contrôle correspondant soit compatible avec celui du modèle, logique ! Sinon, on doit insérer une instance d'une classe dérivée de NSValueTransformer ou encore construire son propre formateur (dérivé de NSFormatter).
De la vue vers le modèle, la réponse est simple, il faut lier les noms des données à des clés (voir la méthode +initialize de Converter.) puis de leur associer une méthode (il s'agit d'une notification dans la terminologie de Cocoa). Ainsi chaque fois que la valeur d'une donnée change, la méthode correspondante est invoquée.

Je comprend que tu ai des problèmes. Il faut dire que la complexité du mécanisme ne justifie pas son efficacité. Je ne connais qu'une petite partie de Core Data.

En ce qui concerne le dernier point, il suffit de modifier la valeur au niveau de l'interface ([anObject setDoubleValue:15.5]) si elle est affichée sinon il faut utiliser la méthode suivante (anObject étant une instance du modèle):

[anObject setValue:[NSNumber numberWithDouble:15.5] forKey:@"dollarsToConvert"];
XDev1 est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Autres systèmes > Mac



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide


Fuseau horaire GMT +1. Il est actuellement 01h50.


Publiez vos articles, tutoriels et cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter