2013-05-08 3 views
0

Вот мой пример класса и использование:ValidateMenuItem не вызывался для 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]; 

здесь validateMenuItem не вызывался. Я установил действие и цель. Target - этот объект класса сам, и я определил validatemenuItem только в этом классе.

Есть ли что-нибудь, что мне не хватает здесь?

+0

Вы назначены Селектор 'menuEventHandler:' как действие, как 'validateMenuItem : 'предполагается называть? –

ответ

1

В коде, который вы опубликовали, CCocoaMenuItem только объявляет метод menuEventHandler: в @interface, но на самом деле его не реализует. Элементы меню не проверяются, если их цель не отвечает на селектор, который вы установили как action (такие пункты меню автоматически отключены).

Btw, menuZone предназначенный для NSMenu, а не NSMenuItem.

+0

Ну, menuEventHndler: реализовано в CCocoaMenuItem. Я забыл добавить его в вопросы. Извините за опечатку .. Так что это не должно быть причиной. Что-нибудь еще? Я также проверил, что установлено setAutoEnableMenuItems. Не мог видеть, что здесь может быть неправильным. Спасибо за любую помощь – test

+0

Я вставил ваш код в пустой проект, добавил реализацию 'menuEventHandler:' в класс 'CCocoaMenuItem', добавил элемент этого класса в меню, а' validateMenuItem: 'был вызван просто отлично. В вашем фактическом коде должно быть что-то еще, чего нет в вашем вопросе. Как вы на самом деле помещаете фиктивный элемент в меню, чтобы он отображался на экране? – omz

+0

Да, он отображается в меню, но всегда отключен. Я пытаюсь показать это меню в меню «Система» (меню Apple). Может ли это изменить ситуацию? – test

0

Для того, чтобы позвонить в validateMenuItem:, потому что это метод делегата от NSMenuDelegate,
вы должны сделать что-то вроде этого:

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