2010-04-09 40 views
6

我有一个NSMenu,其中包含NSMenuItems自定义视图。我需要它,以便在按下alt按钮时,菜单项会改变其外观的一部分(通过它们的视图)。我在NSMenuItem文档中找到了setAlternative,但是,实际上我只能在没有自定义视图的情况下使用NSMenuItems。只要我设置了一个自定义视图,所有的菜单项就会显示出来。 另外,我尝试在菜单打开时获得按键事件。由于另一个运行循环,NSApplication's sendEvent:直到菜单关闭后才会收到事件。因此,我不能只是拦截事件进来。NSMenu中的替代菜单项

有谁知道我可以通过代理或子类通知何时按Alt键打开菜单时通知我吗?

回答

6

您应该设置一个对象作为菜单的委托,然后实施代理方法-menu:updateItem:atIndex:shouldCancel:

这将允许您根据当前修饰符状态在菜单项显示之前更改自定义视图的状态。

您可以通过询问[[NSApp currentEvent] modifierFlags]来获得当前的修饰符。

如果你需要得到通知,如果修改标志改变,而你的菜单打开,实现您的自定义视图中-flagsChanged:方法:

- (void)flagsChanged:(NSEvent*)event 
{ 
    if ([event modifierFlags] & NSAlternateKeyMask) // check for option key 
    { 
     //do something 
    } 
    else 
    { 
     //do something else 
    } 
} 
+0

我需要它当菜单打开发生。就像,不是当菜单打开时,而是在打开时,如果用户用alt键关闭,那么我需要通知它。 – 2010-04-10 19:21:31

+0

我已经更新了有关'-flagsChanged'方法的信息。 – 2010-04-11 01:23:42

+0

我覆盖 - (BOOL)acceptedFirstResponder和 - (BOOL)becomeFirstResponder在我的NSMenuItem的自定义视图类中返回YES。然后我实现了flagsChanged :. menuNeedsUpdate时,我做了第一个菜单项的视图第一响应者:但是,flagsChanged:仍然没有被调用。我也尝试让它在0.5延迟之后成为响应者(在跟踪事件循环模式下),以防万一菜单偷回来。那也行不通。有任何想法吗? – 2010-04-11 12:51:14