Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSMenu中的可选菜单项_Cocoa_Menu_Macos Carbon_Nsmenu_Nsmenuitem - Fatal编程技术网

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延迟后成为响应程序(在跟踪事件循环模式下),以防不知何故菜单把它偷了回来。那也没用。有什么想法吗?你知道怎么做吗?