【问题标题】:Alternative Menu Items in NSMenuNSMenu 中的替代菜单项
【发布时间】:2010-04-09 10:23:55
【问题描述】:

我有一个NSMenu,其中包含带有自定义视图的NSMenuItems。我想要这样当按下 alt 按钮时,菜单项会改变部分外观(通过他们的视图)。我在NSMenuItem 文档中找到了setAlternative,但实际上我只能在没有自定义视图的情况下让它与NSMenuItems 一起工作。一旦我设置了自定义视图,就会显示所有菜单项。 此外,我尝试在菜单打开时获取按键事件。由于另一个运行循环,NSApplication's sendEvent: 在菜单关闭之前不会收到事件。因此,我不能只是拦截进来的事件。

有谁知道我如何在打开菜单时获得通知,无论是通过委托还是子类化,何时按下 alt 键?

【问题讨论】:

    标签: cocoa menu macos-carbon nsmenu nsmenuitem


    【解决方案1】:

    您应该设置一个对象作为菜单的委托,然后实现委托方法-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
        }
    }
    

    【讨论】:

    • 我需要它在菜单打开时发生。就像,不是在菜单打开时,而是在它打开时,如果用户确实按下了 alt,那么我需要通知它。
    • 我已经用-flagsChanged 方法的信息更新了答案。
    • 我在我的 NSMenuItems 的自定义视图类中覆盖了 -(BOOL)acceptsFirstResponder 和 -(BOOL)becomeFirstResponder 以返回 YES。然后我实现了 flagsChanged:。当 menuNeedsUpdate: 但是,flagsChanged: 仍然没有被调用时,我做了第一个菜单项的视图第一响应者。我还尝试在 0.5 延迟后(在跟踪事件循环模式下)让它成为响应者,以防菜单以某种方式把它偷回来。那也没有用。有什么想法吗?
    • 你有没有想过如何做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多