2013-05-08 2 views
0

Voici ma classe d'échantillon et de l'utilisation:ValidateMenuItem n'est pas appelé pour NSMenuItem

@interface CCocoaMenuItem : NSMenuItem 
{ 
    someClass *someobj; 
} 

- (void)menuEventHandler:(id)target; 
- (void)setEnableItem:(BOOL)nEnabled; 

@end 

@implementation CCocoaMenuItem 

- (BOOL)validateMenuItem:(NSMenuItem *)item { 
    // return YES or NO based on some conditions; 
// But this method is not getting called 


} 

@end 
CCocoaMenuItem *dummyItem = [[CCocoaMenuItem allocWithZone:[NSMenu menuZone]] initWithTitle:(NSString*)aStr action:nil keyEquivalent:@""] autorelease]; 
[dummyItem setAction:@selector(menuEventHandler:)]; 
[dummyItem setTarget:dummyItem]; 

ici validateMenuItem n'est pas appelé. J'ai défini l'action et la cible. La cible est cet objet de classe lui-même et j'ai défini validatemenuItem dans cette classe seulement.

Y a-t-il quelque chose qui me manque ici?

+0

Vous sélecteur attribué de 'menuEventHandler:' comme une action, comment 'validateMenuItem : 'est censé être appelé? –

Répondre

1

Dans le code que vous avez publié, CCocoaMenuItem déclare uniquement la méthode menuEventHandler: dans le @interface, mais ne l'implémente pas réellement. Les éléments de menu ne sont pas validés si leur cible ne répond pas au sélecteur que vous avez défini comme action (ces éléments de menu sont automatiquement désactivés).

Btw, menuZone est destiné à NSMenu, et non NSMenuItem.

+0

Eh bien, menuEventHAndler: est implémenté dans le CCocoaMenuItem. J'ai oublié de l'ajouter aux questions. Désolé pour la faute de frappe .. Donc, cela ne devrait pas être la raison. Rien d'autre? J'ai également vérifié que setAutoEnableMenuItems est cochée. Je ne pouvais pas voir quoi d'autre pourrait mal se passer ici. Merci pour toute aide – test

+0

J'ai collé votre code dans un projet vide, ajouté une implémentation 'menuEventHandler:' à la classe 'CCocoaMenuItem', ajouté un élément de cette classe à un menu, et' validateMenuItem: 'a été appelé très bien. Il doit y avoir quelque chose d'autre dans votre code actuel qui ne soit pas dans votre question. Comment mettez-vous réellement l'élément factice dans un menu, de sorte qu'il soit affiché à l'écran? – omz

+0

Oui, il est affiché dans le menu mais toujours désactivé. J'essaie d'afficher ce menu dans le menu Système (menu Pomme). Cela peut-il faire une différence? – test

0

Pour appeler validateMenuItem:, car il est une méthode de délégué de NSMenuDelegate,
vous devez faire quelque chose comme ceci:

@interface CCocoaMenuItem : NSMenuItem <NSMenuDelegate>{ 
    someClass *someobj; 
}