Cocoa NSMenu中的可选菜单项
我有一个Cocoa NSMenu中的可选菜单项,cocoa,menu,macos-carbon,nsmenu,nsmenuitem,Cocoa,Menu,Macos Carbon,Nsmenu,Nsmenuitem,我有一个NSMenu,其中包含带有自定义视图的NSMenuItems。我希望这样,当按下alt按钮时,菜单项将改变其部分外观(通过其视图)。我在NSMenuItem文档中找到了setAlternative,但是,实际上,我只能让它在没有自定义视图的情况下使用NSMenuItems。一旦我设置了自定义视图,所有菜单项都将显示出来。 此外,我还尝试在菜单打开时获取按键事件。由于另一个运行循环,n应用程序的sendEvent:在关闭菜单之前不会接收事件。因此,我不能截获即将到来的事件 是否有人知道如何
NSMenu
,其中包含带有自定义视图的NSMenuItems
。我希望这样,当按下alt按钮时,菜单项将改变其部分外观(通过其视图)。我在NSMenuItem
文档中找到了setAlternative
,但是,实际上,我只能让它在没有自定义视图的情况下使用NSMenuItems
。一旦我设置了自定义视图,所有菜单项都将显示出来。
此外,我还尝试在菜单打开时获取按键事件。由于另一个运行循环,n应用程序的sendEvent:
在关闭菜单之前不会接收事件。因此,我不能截获即将到来的事件
是否有人知道如何通过委托或子类化,在打开菜单时按下alt键时通知我?您应该将一个对象设置为菜单的委托,然后实现委托方法
-menu:updateItem:atIndex:shouldCancel:
这将允许您根据当前修改器状态,在显示菜单项之前更改自定义视图的状态
您可以通过询问[[NSApp currentEvent]modifierFlags]
来获取当前修饰符
如果在菜单打开时修改器标志发生更改时需要得到通知,请在自定义视图中实现-flagshanged:
方法:
- (void)flagsChanged:(NSEvent*)event
{
if ([event modifierFlags] & NSAlternateKeyMask) // check for option key
{
//do something
}
else
{
//do something else
}
}
我需要它在菜单打开时发生。比如,不是在菜单打开时,而是在它打开时,如果用户确实用alt键按下,那么我需要通知它。我已经用
-flagshanged
方法的信息更新了答案。我在我的NSMenuItems的自定义视图类中重写了-(BOOL)acceptsFirstResponder和-(BOOL)becomeFirstResponder以返回YES。然后我实现了flagsChanged:。我在menuNeedsUpdate:时创建了第一个菜单项的view first responder,但是,flagsChanged:仍然不会被调用。我还试着让它在0.5延迟后成为响应程序(在跟踪事件循环模式下),以防不知何故菜单把它偷了回来。那也没用。有什么想法吗?你知道怎么做吗?