Changer l'édition de champs.

muqaddarmuqaddar Administrateur
01:21 modifié dans API AppKit #1
Salut,

Je voudrais faire un truc tout simple en bindings.
Quand je clique sur un bouton "Editer", ça me passe l'état de 10 NSTextField à  "Editable". Comment contrôler cela ?
Merci
«1

Réponses

  • muqaddarmuqaddar Administrateur
    01:21 modifié #2
    J'ai vu qu'il y avait la propriété "IsEditable" mais je vois pas trop comment la gérer sur tous els champs à  partir de mon clic ?
  • ClicCoolClicCool Membre
    01:21 modifié #3
    Faut juste binder "IsEditable" de chaque champs sur une variable boléenne que l'on met à  jour par ses ACCESSEURS dans la méthode action de ton bouton "éditer".

    On doit pouvoir aussi binder directement sur l'état du bouton en créant un NSTransformer revoyant NO pour NSOffState et YES pour NSOnState (et interdire l'état mixte) et du coup même plus besoin d'une méthode d'action !
    Faut quand même coder le transformer mais ce type de transformer a bien des chances de resservir souvent  8)
  • 01:21 modifié #4
    Je ne sais pas si ça convient à  ton cas, mais rien ne t'empêche de lier la valeur de ton bouton à  une préférence, et dire que la propriété éditable de tous les NSTextFields est liée à  cette propriété.
  • muqaddarmuqaddar Administrateur
    septembre 2004 modifié #5
    dans 1094125210:

    Faut juste binder "IsEditable" de chaque champs sur une variable boléenne que l'on met à  jour par ses ACCESSEURS dans la méthode action de ton bouton "éditer".

    On doit pouvoir aussi binder directement sur l'état du bouton en créant un NSTransformer revoyant NO pour NSOffState et YES pour NSOnState (et interdire l'état mixte) et du coup même plus besoin d'une méthode d'action !
    Faut quand même coder le transformer mais ce type de transformer a bien des chances de resservir souvent  8)


    OK, alors je vais essayer le coup du transformeur. ce qui m'étonne, c'est que tu dis qu'il faut binder le bouton, pas les champs ?

    Ah il s'appelle : SetEditableTransformer, il est appelé dans le initialize de MyDocument, mais j'y mets quoi dans

    //le transofrmateur attend de connaà®tre l'état
    - (id)transformedValue:(id)aValue

    Je vois pas comment je gère le NSOnState ici.
    Merci.
  • ClicCoolClicCool Membre
    01:21 modifié #6
    je me suis mal exprimmé, c'est bien les champs que tu bindes.

    par exemple:
    Si tu es sur un myDocument.nib, tu ajoutes un outlet de type NSButton à  ton document "boutonEdition" pointant sur le dit bouton.
    Puis tu bindes la propriété "editable" de tes champs sur le "file's Owner" modelKeyPath: "boutonEdition.state" avec une NSTransformer comme je t'ai décrit.
    J'ai jamais testé mais ça devrait marcher dans la mesure un les NSButtons devraient être modelKeyCompliants.
  • muqaddarmuqaddar Administrateur
    01:21 modifié #7
    Bon j'ai fait la première étape, j'en suis au code du transformeur. :-) Donc ce dernier reçoit YES ou NO en booléen.

    //le transformateur attend de connaà®tre l'état
    - (id)transformedValue:(id)etat
    {
        if (etat==NO) {

    }
    }

    Un truc du genre ?

    Au fait, j'ai trouvé la soluce pour mes tableaux successifs imbriqués :-)
  • ClicCoolClicCool Membre
    01:21 modifié #8
    Non c'est l'inverse  ;)
    Le transformer recevra le state du bouton donc NSOnState ou NSOffState  (interdire le NSMixedState)
    et doit renvoyer YES ou NO au binding de "éditable"
  • muqaddarmuqaddar Administrateur
    01:21 modifié #9
    Ok.
    Sauf que j'ai pas d'outlet pout contrôler le NStextFied ! Comment l'écrire dans le code alors pour faire la comparaison ?
  • ClicCoolClicCool Membre
    01:21 modifié #10
    Pas besoin d'Outlet sur le NSTextField.
    Le NSTextField est bindé sur le Bouton via l'outlet du bouton.

    [size=8pt]Je sens que je vais encore prendre mon apéro en retard ce soir moi ;)[/size]
  • muqaddarmuqaddar Administrateur
    01:21 modifié #11
    Oui, ça c'ets fait dans IB ! Mais je ne vois pas comment écrire ce transformedValue...
  • ClicCoolClicCool Membre
    01:21 modifié #12
    Salut Osxitan :) , toujours des soucis d'ADSL ?

    Pour ta returnedValue tu peux peut-être écrire:
    - (id)transformedValue:(id)aValue<br />{<br />switch (aValue) {<br />    case NSOffState:<br />         return [NSNumber numberWithBOOL: NO];<br />    case NSOnState:<br />         return [NSNumber numberWithBOOL: YES];<br />}
    

    par exemple
  • muqaddarmuqaddar Administrateur
    01:21 modifié #13
    ça va j'ai que 50 erreurs et 6 warnings.  :boss):

    J'ai des problèmes de compatibilité entre les différents types.

    "cannot find method numberWithBOOL " !!! , return type id assumed....
    et "comparison between pointer and integer" : là  c logique

    enfin plein de fois ça :

    error stray \240 in program
    error stray \320 in program
    error stray \240 in program
    error stray \320 in program
    error stray \240 in program
    error stray \320 in program
    ... etc

    :'(

    Et j'ai aussi essayé if à  la place du switch...
  • BruBru Membre
    01:21 modifié #14
    "error stray" ?

    Ca c'est du typique copier-coller entre une fenêtre web php et Xcode...
    Les fins de lignes contiennent un caractère invisible qui perturbe le compilateur.
    Il faut donc retaper les fins de ligne du code copié-collé.

    .
  • muqaddarmuqaddar Administrateur
    septembre 2004 modifié #15
    Merci pour cette info, en retapant le code ces erreurs disparaissent ! ;)

    Ah, il me reste :

    "switch quantity not an integer" et mes pb de numberWithBOOL.

    Pourtant on renvoie bien un BOOL par le transformer...

    #import &quot;SetEditableTransformer.h&quot;<br /><br />@implementation SetEditableTransformer<br /><br />+ (BOOL)allowsreverseTransformation {<br />  return NO;<br />}<br /><br />- (id)transformedValue:(id)etat<br />{<br />       switch (etat) {<br />           case NSOffState: <br />                 return [NSNumber numberWithBOOL: NO];<br />             break;<br />            case NSOnState: <br />                  return [NSNumber numberWithBOOL: YES];<br />            break;          <br />  }<br />}<br /><br />@end
    
  • ClicCoolClicCool Membre
    01:21 modifié #16
    Désolé j'ai merdouillé en tapant le code sur un PC ;)
    Essaies plutot ça:
    switch ([aValue intValue])

    Pour [NSNumber numberWithBool: YES] qui passe pas ... Je sèche. :o
    Essaies de retaper les lignes, y'a peut-être d'autre caractères invisibles quelque part ?
  • muqaddarmuqaddar Administrateur
    septembre 2004 modifié #17
    Crotte de canard, j'ai tappé numberWithBOOL au lieu de numberWithBool !
    Je pensais que Bool était tout le temps en majuscule... autant pour moi.

    Merci boss !

    Plus d'erreur, il me reste une méthode à  implémenter dans le transformer :
    Tu dis que ça sert à  déclarer le type d'objet renvoyé par le transformer, dans mon cas un booléen, alors je pense que ça doit être ça :

    + (Class)transformedValueClass {
    return [NSNumber class];
    }

    Ainsi mon transformeur :

    <br />#import &quot;SetEditableTransformer.h&quot;<br /><br />@implementation SetEditableTransformer<br /><br />+ (BOOL)allowsreverseTransformation {<br />        return NO;<br />}<br /><br />+ (Class)transformedValueClass {<br />     return [NSNumber class];<br />}<br /><br />- (id)transformedValue:(id)etat<br />{<br /> switch ([etat intValue]) {<br />                case NSOnState: <br />                  return [NSNumber numberWithBool: YES];<br />            break;<br />            case NSOffState:<br />                  return [NSNumber numberWithBool: NO];<br />             break;<br />    }<br />}<br /><br />@end
    


    ne renvoie plus d'erreurs.

    Je lance mon prog... mais pas de miracle, en cliquant sur le bouton relié à  l'outlet, rien ne se passe. Pourtant mon NSTextField est bien bindé sur "boutonEdition.state". D'ailleurs comment il sait à  quoi correspond "state" le binding ?
  • ClicCoolClicCool Membre
    01:21 modifié #18
    Bon, il semble que les NSButtons ne passent pas par l'accesseur de state (setState) lorsque l'on clique dessus !  :(
    Donc si on binde sur le state d'un bouton, la valeur initiale est bien prise en compte mais le binding ne détecte pas le changement d'état lorsqu'on clique sur le bouton !

    Les boutons ne semblent pas respecter les impératif du Key Value Observing sur ce point !
    ça ressemble à  un bug,
    Quelqu'un a déjà  expérimenté ce pb ? ???
  • ClicCoolClicCool Membre
    01:21 modifié #19
    Bon, on peut pas se fier à  la propriété state du bouton donc

    Oublies l'IBOutlet du bouton,
    Crées une variable d'instance de type int dans myDocument: "vEditable" destinée à  recevoir l'état (NSOnState etc...) du bouton.
    Binde le bouton par sa value sur filesOwner keyPath "vEditable". Le binding se chargera de la synchronisation avec le bouton.

    Binde enfin la propriété enable et editable de tes champs sur filesOwner keyPath "vEditable".

    Et voilà  ça marche  8)
  • muqaddarmuqaddar Administrateur
    01:21 modifié #20
    "Binde le bouton par sa value" ?

    Tu veux pas plutôt dire de binder son target, y'a pas de value pour les boutons...

    (ps : tjs pas d'adsl)
  • ClicCoolClicCool Membre
    01:21 modifié #21
    Oh, excuses moi, j'ai pas été assez précis.
    Par commodité, j'utilise ici un NSButton un peu particulier de type boite à  cocher (chekBox) ou mieux encore dans ton cas un bouton avec un comportement de type On/Off (à  sélectionner dans le panneau Attributes des info du bouton. Behavior: On/Off) qui colle assez bien à  ton usage. Quand t'es en mode édition, le bouton est "enfoncé", un peu comme le bouton "Modifier" du carnet d'adresses.
    C'est boutons là  se bindent sans pb sur leur "value": on ou off. Justement ce qu'on veut 8)
  • TiffTiff Membre
    01:21 modifié #22
    dans 1094470794:

    (ps : tjs pas d'adsl)

    Connexion coupée ce matin, ai débranché la freebox et rebranché. Connection revenue un peu plus tard (1h ?). Sais pas si y a un rapport.
  • muqaddarmuqaddar Administrateur
    01:21 modifié #23
    Moi ça vient de revenir là ...mais pour combien de temps ? (j'ai écrit à  Free)
  • TiffTiff Membre
    01:21 modifié #24
    Un copain a renvoyé sa freebox, qui n'a jamais fonctionné. Free lui demande 95 euros de frais de résiliation. >:(
  • muqaddarmuqaddar Administrateur
    septembre 2004 modifié #25
    J'en reviens à  nos moutons... ;)

    ça y est, ça marche ClicCool, mais j'ai un petit soucis.
    Quand le champ devient Editable, et bien, si on veut modifier le texte, le texte du NoSelection placeholder reste en dessous, c'ets pas très fun, mais brouillon... Dès que je vais à  un autre champ ça disparaà®t, mais pour l'édition, c'ets dég !

    As-tu une idée ?

    [Fichier joint supprimé par l'administrateur]
  • ClicCoolClicCool Membre
    01:21 modifié #26
    En effet il semble que dès qu'on entre en édition du champ, la sélection soit "virtuellement" perdue et no sélection se sur-imprimme.
    Virtuellement car le champs permet tout de même l'édition de la valeure (non) sélectionnée ???
    un Bug peut-être ??
    Je continue de chercher, si quelqu'un a une idée elle est la bienvenue :)
  • muqaddarmuqaddar Administrateur
    01:21 modifié #27
    ouais j'ai pas trouvé de soluce, de toute façon, ne vaut-il pas mieux ajouter un tiroir pour l'édition des champs ?

    Là  qd je clique, c'ets dommage que le texte n'apparaisse pas ds un champ blanc par exemple !
  • ClicCoolClicCool Membre
    01:21 modifié #28
    T'as qu'à  mettre " " comme place holder en cas de no-selection ;)
    en attendant mieux
  • muqaddarmuqaddar Administrateur
    01:21 modifié #29
    Ouais, bonne idée jeunot ! ;)
  • muqaddarmuqaddar Administrateur
    01:21 modifié #30
    En fait, il faudrait le même système que le carnet d'adresse : si le champ devient vide en édition, ça remet une valeur par défaut (No selction, toto, titi...etc), sinon, du moment que y'a un caractère, ça le prend en compte...

    D'autre part, en mode édition, il faudrait faire apparaà®tre un cadre autour du texte, tjs comme le carnet d'adresses...héhé encore du taf ;-)
  • ClicCoolClicCool Membre
    01:21 modifié #31
    dans 1094763360:

    En fait, il faudrait le même système que le carnet d'adresse : si le champ devient vide en édition, ça remet une valeur par défaut (No selction, toto, titi...etc), sinon, du moment que y'a un caractère, ça le prend en compte...

    Ce devrait être faisable avec le Null Place Holder :)
    D'autre part, en mode édition, il faudrait faire apparaà®tre un cadre autour du texte, tjs comme le carnet d'adresses...héhé encore du taf ;-)

    Pour ça tu peux encadrer le champs d'une NSBox dont tu bindes (encore ;) ) la propriété Hiden avec isEditable du champs. Mais là  le cadre apparâit dès que c'est éditable et pas seulement quand c'est édité.
    Je regarde de plus près ce qu'on peut faire :)
Connectez-vous ou Inscrivez-vous pour répondre.