NSPopUpButton item et identifiant

RocouRocou Membre
07:57 modifié dans API AppKit #1
Est-il possible d'associer un identifiant à  un item de NSPopUpButton?

La raison à  ma question est simple:

exemple:

Je récupère d'une base de données une liste de clients.
J'initialise mon NSPopUpButton avec cette liste de clients.

Je voudrais ensuite faire des recherches dans la base de données sur le client sélectionné. Mais bien sûr, partir du nom affiché n'est pas très judicieux, il vaut mieux partir de l'identifiant (unique) du client. C'est cet identifiant que je voudrais associer au nom du client sélectionné.
Dois-je programmer cela "à  l'ancienne", c'est à  dire en ajoutant un NSPopUpButton invisible dans lequel je stockerais les identifiants? (ce NSPopUpButton réagirait en parallèle à  celui contenant le nom des clients)

Réponses

  • mpergandmpergand Membre
    07:57 modifié #2
    Tu peux associer un object à  chaque menuItem:


    setRepresentedObject:
    Sets the object represented by the receiver.

    - (void)setRepresentedObject:(id)anObject

    Parameters
    anObject
    The object to be represented by the receiver.

    Discussion
    By setting a represented object for a menu item, you make an association between the menu item and that object. The represented object functions as a more specific form of tag that allows you to associate any object, not just an arbitrary integer, with the items in a menu.

    For example, an NSView object might be associated with a menu item"when the user chooses the menu item, the represented object is fetched and displayed in a panel. Several menu items might control the display of multiple views in the same panel.

    Availability
    Available in Mac OS X v10.0 and later.
    See Also
    – setTag:
    – representedObject
  • RocouRocou Membre
    07:57 modifié #3
    dans 1235753731:

    Tu peux associer un object à  chaque menuItem:

    Merci, je n'étais pas sûr d'avoir compris ce passage tellement cela me paraissait merveilleux!  :adios!:
  • RocouRocou Membre
    07:57 modifié #4
    dans 1235753731:

    Tu peux associer un object à  chaque menuItem:

    Bon, je n'y arrive pas.
    setRepresentedObject ne permet pas d'associer un objet à  un item à  un index précis.
    J'ai essayé setTag mais le problème est le même.

    Si je fais:

    //j est un NSNumber et monPopup est un NSPopUpButton

    [monPopup setTag:j];
    NSLog(@tag: %@", [monPopup tag]);


    ça semble fonctionner mais si j'essaie d'utiliser ailleurs dans mon code [monPopup tag], il n'y a plus rien dedans (null)  :(
  • AliGatorAliGator Membre, Modérateur
    07:57 modifié #5
    Ce n'est pas à  tout le PopupButton qu'il faut associer un tag, c'est à  chaque NSMenuItem qui le compose, que tu dois donner un tag différent ! Justement pour différencier chaque NSMenuItem dudit PopupButton ;)

    Après tu as plusieurs solutions de toute façon pour différencier les items d'un NSPopupMenu : utiliser un couple target/action différent pour chaque item, utiliser un tag, un representedObject... Mais tout ça se fait sur chaque NSMenuItem de ton PopupMenu et non sur le PopupMenu lui-même !
  • RocouRocou Membre
    mars 2009 modifié #6
    dans 1235996140:

    Ce n'est pas à  tout le PopupButton qu'il faut associer un tag, c'est à  chaque NSMenuItem qui le compose, que tu dois donner un tag différent ! Justement pour différencier chaque NSMenuItem dudit PopupButton ;)

    Après tu as plusieurs solutions de toute façon pour différencier les items d'un NSPopupMenu : utiliser un couple target/action différent pour chaque item, utiliser un tag, un representedObject... Mais tout ça se fait sur chaque NSMenuItem de ton PopupMenu et non sur le PopupMenu lui-même !


    D'accord. J'ai donc adapté mon code qui se compile très bien mais l'application plante:

    NSString *k=[leDico valueForKey:@id];

    NSInteger j=[k integerValue];

    NSMenu* monMenu = [monPopup menu];

    NSMenuItem *monMenuItem = [monMenu itemAtIndex:i]; //ce code est dans une boucle...

    [monMenuItem setTag:j]; //ça plante ici.
  • mpergandmpergand Membre
    07:57 modifié #7
    Relis bien la doc, car tu fais n'importe quoi  ;)

    //j est un NSNumber et monPopup est un NSPopUpButton

      [monPopup setTag:j];

    :fouf):

    setTag:
    Sets the tag of the receiver.

    - (void)setTag:(int)anInt


    setTag reçoit un int pas un NSNumber !

    Pou gérer les representedObject, il vaut mieux créer un NSMenuItem plutôt que de faire addItemWithTitle:

    <br />NSMenu* menu=[monPopup menu];<br />NSMenuItem* item=[[NSMenuItem alloc] initWithTitle:@&quot;Titre de menu&quot; <br />					action:nil<br />					keyEquivalent:@&quot;&quot;];<br />[item setRepresentedObject:[NSNumber numberWithInt:100]];<br />// ou<br />[item setTag:100; // tag est un entier !<br /><br />[menu addItem:item];<br />[item release];<br /><br />
    


  • BaardeBaarde Membre
    07:57 modifié #8
    dans 1235999636:

    [pCBM setTag:j]; //ça plante ici.

    A quoi correspond la variable pCBM ? Es-tu sûr que c'est bien un objet NSMenuItem ? Quelle erreur récupères-tu lors du plantage de l'application ?
  • RocouRocou Membre
    mars 2009 modifié #9
    dans 1236007063:

    dans 1235999636:

    [pCBM setTag:j]; //ça plante ici.

    A quoi correspond la variable pCBM ? Es-tu sûr que c'est bien un objet NSMenuItem ? Quelle erreur récupères-tu lors du plantage de l'application ?

    Une erreur de copier-coller. J'ai corrigé.
    il faut lire: [monMenuItem setTag:j];
    Sinon, je ne récupère aucune erreur, le debugger se lance et c'est tout.
  • RocouRocou Membre
    07:57 modifié #10
    dans 1235999884:

    <br />NSMenu* menu=[monPopup menu];<br />NSMenuItem* item=[[NSMenuItem alloc] initWithTitle:@&quot;Titre de menu&quot; <br />					action:nil<br />					keyEquivalent:@&quot;&quot;];<br />[item setRepresentedObject:[NSNumber numberWithInt:100]];<br />// ou<br />[item setTag:100; // tag est un entier !<br /><br />[menu addItem:item];<br />[item release];<br /><br />
    





    Bon, je me suis inspiré de ton bout de code et cela semble fonctionner. Par contre, je ne suis pas sûr de mes allocations et de mes release (aucun...)

    NSString *k=[leDico valueForKey:@id];
    NSInteger j=[k integerValue];

    NSMenu* monMenu = [monPopup menu];

    [[monMenu itemAtIndex:i] setTag:j];
  • mpergandmpergand Membre
    07:57 modifié #11
    non, pas de problème de mémoire.

    Mais si l'ID est un nombre, tu peux mettre un NSNumber dans ton dico, plutôt qu'un NSString.



  • RocouRocou Membre
    07:57 modifié #12
    dans 1236014232:

    non, pas de problème de mémoire.

    Mais si l'ID est un nombre, tu peux mettre un NSNumber dans ton dico, plutôt qu'un NSString.


    Il faut que je me plonge davantage dans la doc de PostgreSQL (l'ID est issu d'une table de base de données PostgreSQl).

    Mais en tout cas, merci pour le coup de main.
    Merci à  tous.
Connectez-vous ou Inscrivez-vous pour répondre.