attacher et retrouver des custom data à NSMenu

J'ai un Pb qui me semble simple ( et qui était trivial sous Carbon... ) .. et dont je ne trouve pas de solution dans cocoa
je souhaite associer des données privées à un menu résidant en Nib( pas à des menu items ) .
et pouvoir les relire dans la procédure menuNeedsUpdate ou menuWillOpen du delegate.
Dans IB , je vois qu'on peut attribuer des "User Defined Runtime Attributes" à un NSMenu.
J'ai donc attribué un attribut " ID, Number, 100" à un menu en Nib.
Mais impossible de savoir comment récupérer mes data quand j'ai reçu le NSMenu dans (void)menuNeedsUpdate:(NSMenu*)menu;
j'ai tenté :
Ivar ivar = class_getInstanceVariable([self class], "ID") renvoie null.. visiblement ID n'est pas variable d'instance...
menuID= [ menu valueForKey:@ID] crash...(_ this class is not key value coding-compliant for the key ID._)

Y a t'il un moyen de faire çà ?
Merci d'avance !
Paul

Réponses

  • Sous-classe NSMenu et rajoute une variable d'instance ID: NSNumber non ? Dans le delegate tu cast menu pour récupérer la valeur et c'est gagné.
    Les User Defined Runtime Attributes ça ne fonctionne que si les attributs existent. Je ne sais pas comment ça marche en Carbon.

  • James78James78 Membre
    juillet 2018 modifié #3

    merci pour la réponse . J'ai fait çà :

    #import <Foundation/Foundation.h>
    #import <AppKit/NSMenu.h>
    @interface MyMenu: NSMenu { @public  NSNumber *ID;}
    @end 
    

    et dans le delegate :

    - (void)menuNeedsUpdate:(NSMenu*)menu
    {
      NSNumber *menuID;
      menuID= ((MyMenu*)menu)->ID;
    }
    

    je recupère nil pour menuID...
    et dans le log je trouve ceci.. qui me semble indiquer que ce n'est pas possible :
    Failed to set (ID) user defined inspected property on (NSMenu): [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key ID.

    jai faux quelque part ??
    paul

  • Euh oui et non.
    Il faut que tu vérifies bien que menu est un object MyMenu:

    NSNumber *menuID = nil;
    if ([menu isKindOfClass:[MyMenu class]) {
        menuID = [(MyMenu *)menu ID];
    } else {
        //Ce n'est pas un objet de classe MyMenu, mais de classe Menu.
    }
    

    Maintenant menuNeedsUpdate:; c'est une méthode delegate ? À quel moment tu mets tes customs MyMenu ?

  • euh.. l'ai le droit de sous-classer les menus de la barre principale ?

  • après essai.. oui j'ai le droit !.
    et ca fonctionne !
    Merci à tous pour votre aide.
    Paul

Connectez-vous ou Inscrivez-vous pour répondre.