【问题标题】:NSButton Mousedown eventNSButton 鼠标按下事件
【发布时间】:2010-09-06 13:18:50
【问题描述】:

我试图在鼠标按下按钮时显示弹出菜单。该按钮应该在鼠标按下时显示为按下状态,并且在鼠标按下时“未按下”,无论选择了任何菜单项。类似于用于添加应用程序的 Expose/Space Preference 面板“+”按钮。

到目前为止,我尝试了 3 种方法:

  1. 点击按钮时发送动作。但是这里弹出菜单出现在鼠标向上而不是鼠标向下

  2. 子类 NSButton 并覆盖 mouseDown:。弹出菜单出现在鼠标按下时,我可以选择任何菜单项。但是当弹出菜单消失时,按钮似乎被按下了。因此,我需要再次单击以“取消按下”按钮,然后才能再次获得相同的操作。

  3. NSEvent addLocalMonitorForEventsMatchingMask。与 2 类似的行为。

有什么建议吗?我猜方法 2 或 3 是正确的方法,只需要“松开”鼠标上的按钮。

【问题讨论】:

  • 为什么不直接使用 NSPopUpButton?

标签: cocoa appkit nsevent


【解决方案1】:

相当老的线程。但这是我最近遇到的问题,所以如果我被允许贡献...

在我的情况下,使用 NSPopupButton 不是一种选择。因为 NSPopupButton 创建了它自己的我不需要的 NSMenu(而且我不知道如何让它消失)。

我找到了另一种方法。有可能在不继承它的情况下更改默认的 NSButton 行为。只需使用 NSControl 类的-sendActionOn: 方法(在-awakeFromNib 中的某处):

[_myButton sendActionOn:NSEventMaskLeftMouseDown];

现在按钮的动作在 mouseDown 事件上发送。 希望这会有所帮助。

【讨论】:

  • 完美。这正是我所需要的。非常感谢!
  • NSPopUpButton 有一个 -setMenu: 方法。弹出窗口是更好的选择,因为它的行为类似于标准控件(因为它标准控件)。
【解决方案2】:

正如彼得所说,您可以使用 NSPopUpButton。不明显的是,您可以像使用 NSButton 一样配置按钮的样式、图像、标题等。

【讨论】:

    【解决方案3】:

    Swift“语法”

    myButton.sendAction(on: .leftMouseDown)
    

    或者:

    子类 NSButton:

    class ButtonDown: NSButton {
        override func awakeFromNib() {
            super.awakeFromNib()
    
            self.sendAction(on: .leftMouseDown)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多