IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apple Discussion :

[Cocoa]Bindings et KVC/KVO


Sujet :

Apple

  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Points : 139
    Points
    139
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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 !

  2. #2
    Membre régulier
    Homme Profil pro
    Aucun
    Inscrit en
    Avril 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Aucun

    Informations forums :
    Inscription : Avril 2008
    Messages : 78
    Points : 79
    Points
    79
    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.

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Points : 139
    Points
    139
    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 ?

  4. #4
    Membre régulier
    Homme Profil pro
    Aucun
    Inscrit en
    Avril 2008
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Aucun

    Informations forums :
    Inscription : Avril 2008
    Messages : 78
    Points : 79
    Points
    79
    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"];

Discussions similaires

  1. traquer des requêtes non bindées
    Par aline dans le forum Oracle
    Réponses: 3
    Dernier message: 14/03/2005, 11h56
  2. Récupérer l'adresse de bind d'un socket
    Par gloode dans le forum Réseau
    Réponses: 4
    Dernier message: 04/02/2005, 10h56
  3. Bind ou pas Bind?
    Par jonzuzu dans le forum MFC
    Réponses: 4
    Dernier message: 19/03/2004, 10h00
  4. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  5. Bind - sous-domaine
    Par _Gabriel_ dans le forum Réseau
    Réponses: 4
    Dernier message: 07/03/2004, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo