Popup et bindings

muqaddarmuqaddar Administrateur
04:19 modifié dans API AppKit #1
Salut,

Je dois binder le contenu d'un popup sur le contenu d'un ArrayController (pas de pb sous IB ou "on the fly") mais je dois cumuler en plus une entrée dans la liste, là  ça se corse...
Je pourrai ajouter une entrée en plus ds le dictionnaire qui alimente le tableau, mais il ne faut qu'il soit vu dans ce tableau mais uniquement dans la liste.
J'ai aussi essayé avec addItemWithTitle sans succès.

[websitesPopup addItemWithTitle : @No dedicated server];
[websitesPopup bind: @contentValues toObject: serversController withKeyPath:@arrangedObjects options: nil];

Merci de m'éclairer.

Réponses

  • ClicCoolClicCool Membre
    04:19 modifié #2
    Salut osxitan :)

    Tu veux ajouter au popUp une ligne @No dedicated server sans ajouter cette ligne dans "l'Array-source" ? c'est ça ?

    C'est alors d'un Place Holder dont tu sembles avoir besoin, pour gérer l'absence de choix d'un serveur dans ton PopUp.

    Bindes alors le "content" du popUp à  la volée sur ton "l'Array-source" avec comme option:
    <br /> NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary];<br />   [bindingOptions setObject:@&quot;No dedicated server&quot; forKey:@&quot;NSNullPlaceholder&quot;];<br />        [bindingOptions setObject:[NSNumber numberWithBool:YES] forKey:@&quot;NSInsertsNullPlaceholder&quot;];<br />
    
  • muqaddarmuqaddar Administrateur
    04:19 modifié #3
    Merci ClicCool.

    NSMutableDictionary *bindingOptions = [NSMutableDictionary dictionary];<br />&nbsp; &nbsp; [bindingOptions setObject:@&quot;No dedicated server&quot; forKey:@&quot;NSNullPlaceholder&quot;];<br />&nbsp; &nbsp; [bindingOptions setObject:[NSNumber numberWithBool:YES] forKey:@&quot;NSInsertsNullPlaceholder&quot;];<br /><br />     [websitesPopup bind: @&quot;content&quot; toObject: serversController withKeyPath:@&quot;arrangedObjects.dicServers.name&quot; options: bindingOptions];<br />
    


    ça semble marcher, seulement quand je vais sur les autres enregistrements, ça les sélectionne pas, ça reste sur le NSNullPlaceHolder... Par ailleurs si tu pouvais (ou un autre) m'expliquer la différence entre NSNullPlaceholder et NSInsertsNullPlaceholder ?
    merci 
  • muqaddarmuqaddar Administrateur
    septembre 2004 modifié #4
    Ah, j'étais en Pulldown et pas popup.... dans les attributes, je peux sélectionner maintenant. :-)

    En revanche, impossible de binder "enable" sur un booléen ?
  • ClicCoolClicCool Membre
    04:19 modifié #5
    dans 1095317760:

    Par ailleurs si tu pouvais (ou un autre) m'expliquer la différence entre NSNullPlaceholder et NSInsertsNullPlaceholder ?


    Salut Osxitan ;)

    Le NSNullPlaceHolder est utilisé lorsqu'un binding retourne une valeur nulle.
    Ici donc tu spécifies ton place holder avec:
    [bindingOptions setObject:@&quot;No dedicated server&quot; forKey:@&quot;NSNullPlaceholder&quot;];
    


    Pour les PopUp tu peux demander aussi d'insérer l' "item Null" qui va afficher le dit NullPlaceHolder et permettre à  l'utilisateur de le choisir explicitement au moyen du popUp.
    ici tu dit, affiche carrément un item de plus qui affichera le nullPlaceHolder:
    [bindingOptions setObject:[NSNumber numberWithBool:YES] forKey:@&quot;NSInsertsNullPlaceholder&quot;];<br />
    

    (YES, je veux l'item null dans mon cher popUp)
    Si tu as défini comme ici un place Holder perso dans les options, il sera alors utilisé ici, sinon c'est un NullPlaceHolder par défault (en anglais) qui sera défini (@no value je crois). 8)
  • TiffTiff Membre
    04:19 modifié #6
    @no value je crois

    Je confirme.
  • muqaddarmuqaddar Administrateur
    04:19 modifié #7
    OK, bien compris :-) Merci.

    En revanche, je patine sur l'enable du popup qui semble ne pas vouloir de BOOL ?
  • ClicCoolClicCool Membre
    04:19 modifié #8
    dans 1095319555:

    En revanche, je patine sur l'enable du popup qui semble ne pas vouloir de BOOL ?

    C'est pas un BOOL en effet qu'il veut mais un NSNumber contenant une valeur boléenne ;)
  • muqaddarmuqaddar Administrateur
    septembre 2004 modifié #9
    Pourtant il ne veut pas de ça :

    - (id)transformedValue:(id)etat
    {
    switch ([etat intValue]) {
    case NSOnState:
    return [NSNumber numberWithBool: YES];
    break;
    case NSOffState:
    return [NSNumber numberWithBool: NO];
    break;
    }
    }

    ? à  la différence de editable ?


    2004-09-16 14:12:59.844 webmasterMemory[2814] Cannot create BOOL from object <_NSControllerObjectProxy: 0x3648d0> of class _NSControllerObjectProxy
    2004-09-16 14:12:59.849 webmasterMemory[2814] *** Uncaught exception: <NSInternalInconsistencyException> Cannot create BOOL from object <_NSControllerObjectProxy: 0x3648d0> of class _NSControllerObjectProxy
  • ClicCoolClicCool Membre
    04:19 modifié #10
    C'est sans doute du au fait que les états du popUp ne sont pas NSOnState et NSOffState non ? ;)
    Tu devrais inclure à  ton transformer la gestion des erreurs dues à  des valeurs non attendues ;)
  • muqaddarmuqaddar Administrateur
    04:19 modifié #11
    Je pige pas là . Je croyais que NSOnState et NSOffState se rapportaient à  l'état du bouton Edition !!!
    Pas au NSTextfield ni au NSPopUp ! Non ?
  • ClicCoolClicCool Membre
    04:19 modifié #12
    Oups, j'avais cru comprendre que c'était cette fois le popUp que tu bindais avec ce transformer ?

    Essaies néanmoins de rajouter un case pour les autres valeurs voire même de mettre un NSLog dans les différents cas, ou mieux de mettre un point d'arret dans le transformer pour lire la valeur qui lui a été transmise.
  • muqaddarmuqaddar Administrateur
    04:19 modifié #13
    Bein non, tu écris plu haut que enabled attend un NSNumber avec Bool, or c 'est ce que ej renvoie de mon transformer depuis la début, ça marche avec editable mais pas enabled... :(
  • ClicCoolClicCool Membre
    04:19 modifié #14
    dans 1095368095:

    Bein non, tu écris plu haut que enabled attend un NSNumber avec Bool, or c 'est ce que ej renvoie de mon transformer depuis la début, ça marche avec editable mais pas enabled... :(

    Oui le binding sur la propriété enabled d'un popUp attends bien un NSNumber contenant un Boléen. Pour s'en assurer tu peux aller sous I.B. et voir que les transformers dispo pour ce bindings renvoient tous un booléen (NSIsNotNil, NSIsNil, NSNegateBoolean).

    Bizard bizard
    j'ai dit bizard moi ?
    tiens, comme c'est bizard ...

    Vérifie ne débuggage ce qu'il se passe dans ton transformer car ton message d'erreur ne dit pas qu'il ne veut pas d'un BOOL mais qu'il ne peut créer de Bool à  partir de ce qu'il reçoit.
    Il est fort possible que ton transformer ne fonctionne pas comme attendu ... En particulier, ton transformer ne renvoie rien du tout si aucun des 2 cases n'est conforme à  ce qu'il reçoit.
    Je sais pas pourquoi il ne recevrait pas NSOnState ou NSOffState mais on comprendrait mieux si on vérifiait ... ;)
  • muqaddarmuqaddar Administrateur
    04:19 modifié #15
    Ah je me prends une SIGSEGV dur to signal 11 qd j'ajoute un nsLog :

    - (id)transformedValue:(id)etat
    {
    NSLog("valeur de etat : %i", [etat intValue]);
    switch ([etat intValue]) {
    case NSOnState:
    return [NSNumber numberWithBool: YES];
    break;
    case NSOffState:
    return [NSNumber numberWithBool: NO];
    break;
    }
    }
  • ClicCoolClicCool Membre
    04:19 modifié #16
    dans 1095412284:

    Ah je me prends une SIGSEGV dur to signal 11 qd j'ajoute un nsLog :

    - (id)transformedValue:(id)etat
    {
    NSLog("valeur de etat : %i", [etat intValue]);
    switch ([etat intValue]) {
    case NSOnState:
    return [NSNumber numberWithBool: YES];
    break;
    case NSOffState:
    return [NSNumber numberWithBool: NO];
    break;
    }
    }


    ça c'est normal tu as oublié le @ magique devant le " ;)

    Essies ton simplement ça
    NSLog(@&quot;appelé avec l&#39;état %@&quot;, etat);
    
  • ClicCoolClicCool Membre
    04:19 modifié #17
    Il me vient une idée (ça m'arrive parfois ;) )

    Si ton popUp n'a pas d'item il restera désactivé.

    Essaies de débinder le "contentValues" et laisse le avec le contenu (item1, item2, item3) défini sous I.B. pour voir si par hasard c'est pat le binding du contenu qui fait tout foirer  ???
  • muqaddarmuqaddar Administrateur
    04:19 modifié #18
    Bon je crois que j'ai trouvé mais je ne sais pas pourquoi ça marche.

    A l'origine, nous récupérions un int "websiteEditable", que le transformer analysait, pui renvoyait un NSNumber BOOL.
    Et bien en changeant ce int de base en NSNumber ça marche :

    NSNumber *websiteEditable;

    Puis ds le transformer :

    switch ([etat boolValue]) {
    case NSOnState:
    return [NSNumber numberWithBool: YES];
    break;
    case NSOffState:
    return [NSNumber numberWithBool: NO];
    break;
    }

    Ce que je ne saisis pas, c'ets que "etat boolValue" puisse être NSOnState ou NSOffState (tout comme le int d'ailleurs)... ça drrvait pas être YES ou NO ???
  • muqaddarmuqaddar Administrateur
    04:19 modifié #19
    En fait je viens de m'apercevoir que le transformeur ne servait à  rien !!!!
    la variable NSNumber *websiteEditable qui sert de valueKeyPath semble suffisante pour binder le bouton edition, ensuite binder editable ou enabled sur cette variable, et ça semble suffir !!!
  • ClicCoolClicCool Membre
    04:19 modifié #20
    En fait il s'avère que les constantes NSOnState et NSOffState correspondent respectivement à  1 et 0.

    La BoolValue d'un NSNumber à  0 est False
    La BoolValue d'un NSNumber AUTRE QUE zéro est VRAI.
    j'ai bien dit autre que zéro, pas uniquement 1, ce qui veut dire que NSMixedState donnera ausi VRAI ce qui n'est pas forcément adapté.

    De plus les valeurs de NSOnState et NSOffState ne sont pas garanties. Si à  l'avenir Apple change la valeur de ces constantes, seules les références au constantes NSOnState et NSOffState permettront à  ton code de s'y retrouver.
  • muqaddarmuqaddar Administrateur
    septembre 2004 modifié #21
    Soit. Alors tu conseilles tout de même le transformer qui veut pas marcher avec enabled, bien que je retourne mon NSNumberBooléen ?  :why?:

    Sinon, dans un autre ordre d'idée, j'ai essayé de binder l'état enabled d'un bouton sur un NSArray, en selection, avec ValueKeyPath "dicWebsites.name", et No Selection placeholder à  "No". Et bien l'enable marche à  l'envers... J'ai mis "Yes" ensuite, mais c'est pareil.
    Le but étant de rendre le bouton cliquable uniquement qd un enregsitrement est sélectionné ds le NSArray...
  • ClicCoolClicCool Membre
    04:19 modifié #22
    dans 1095421055:

    Le but étant de rendre le bouton cliquable uniquement qd un enregsitrement est sélectionné ds le NSArray...

    Pour ça c'est simple :)

    Tu bindes le bouton à  la "selectedObjects" de ton ArrayController et tu choisi le transformer NSIsNotNil.
    Le bouton ne sera actif que si une ligne au moins est sélectionnée.

    Tu peux aussi choisir de ne le désactiver que si un champs donné n'est pas renseigné alors tu bindes sur "selection.laClefsDuChamp" avec le même transformer.
    Le bouton ne sera clicable que si le bon champs est renseigné sur la ligne sélectionnée.

    P.S. Ne te serts pas des placeHolders pour ça
  • muqaddarmuqaddar Administrateur
    04:19 modifié #23
    dans 1095428214:

    dans 1095421055:

    Le but étant de rendre le bouton cliquable uniquement qd un enregsitrement est sélectionné ds le NSArray...

    Pour ça c'est simple :)

    Tu bindes le bouton à  la "selectedObjects" de ton ArrayController et tu choisi le transformer NSIsNotNil.
    Le bouton ne sera actif que si une ligne au moins est sélectionnée.

    Tu peux aussi choisir de ne le désactiver que si un champs donné n'est pas renseigné alors tu bindes sur "selection.laClefsDuChamp" avec le même transformer.
    Le bouton ne sera clicable que si le bon champs est renseigné sur la ligne sélectionnée.

    P.S. Ne te serts pas des placeHolders pour ça



    ça marche avec Selection et non selectedObjects ;-)
    Merci.
  • ClicCoolClicCool Membre
    04:19 modifié #24
    dans 1095431072:

    ça marche avec Selection et non selectedObjects ;-)

    ça marche pas avec avec le control key à  "arangedObjects" en laissant le Model Key Path en blanc ? ???
  • muqaddarmuqaddar Administrateur
    04:19 modifié #25
    Euh non, ça, ça marche pas... ça paraà®t logique, déjà  y'a pas de sélection non ?
  • ClicCoolClicCool Membre
    septembre 2004 modifié #26
    dans 1095447595:

    Euh non, ça, ça marche pas... ça paraà®t logique, déjà  y'a pas de sélection non ?


    ben oui c'est logique que s'il n'y a pas de sélection, y'a pas de selected obects dons si t'as mis le NSIsNotNilTransformer ça renvoie faux et ton bouton est désactivé.

    Mais s'il y a une ou plusieurs lignes sélectionnées, selected objects n'est pas nil et ton bouton est activé.
    :D

    [EDIT] je viens de tester chez moi et ça marche  ;D
  • aranaudaranaud Membre
    04:19 modifié #27
    J'aimerai savoir la différence dans la partie binding entre content et contentValue pour les objets NSPopUpButton.
Connectez-vous ou Inscrivez-vous pour répondre.