【问题标题】:ValidateMenuItem is not getting called for NSMenuItem没有为 NSMenuItem 调用 ValidateMenuItem
【发布时间】:2013-05-08 15:25:45
【问题描述】:

这是我的示例类和用法:

@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。

这里有什么我遗漏的吗?

【问题讨论】:

  • 您将menuEventHandler: 的选择器指定为操作,应该如何调用validateMenuItem:

标签: cocoa nsmenuitem nsmenu


【解决方案1】:

在您发布的代码中,CCocoaMenuItem 仅在@interface 中声明了menuEventHandler: 方法,但并未实际实现它。如果菜单项的目标没有响应您设置为 action 的选择器,则不会验证菜单项(此类菜单项会自动禁用)。

顺便说一句,menuZone 用于NSMenu,而不是NSMenuItem

【讨论】:

  • 嗯,menuEventHAndler: 是在CCocoaMenuItem 中实现的。我忘了在问题中添加它。抱歉打错了..所以这不应该是原因。还要别的吗?我还检查了 setAutoEnableMenuItems 是否被选中。看不出这里还有什么问题。感谢您的帮助
  • 我已将您的代码粘贴到一个空项目中,将 menuEventHandler: 实现添加到 CCocoaMenuItem 类,将该类的一项添加到菜单中,并且 validateMenuItem: 被调用就好了.您的实际代码中必须有其他内容不在您的问题中。您实际上是如何将虚拟项目放入菜单中以使其显示在屏幕上的?
  • 是的,它会显示在菜单中,但始终禁用。我正在尝试在系统菜单(Apple 菜单)中显示该菜单。这会有所作为吗?
  • 您是指带有 Apple 标志 () 的菜单还是带有您的应用名称的菜单?
【解决方案2】:

为了调用validateMenuItem:,因为是NSMenuDelegate的委托方法,
你必须这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多