我正试图在按钮上显示鼠标按下弹出菜单。鼠标按下时按钮应显示为按下,无论选择了任何菜单项,鼠标按下都会“按下”。类似于Expose / Space Preference面板“+”按钮,用于添加应用程序。
到目前为止,我尝试了3种方法:
单击按钮时发送的操作。但是这里弹出菜单出现在鼠标上而不是鼠标按下
子类NSButton并覆盖mouseDown:。鼠标按下时出现弹出菜单,我可以选择任何菜单项。但是当弹出菜单消失时,按钮出现了按下状态。因此,我需要再次单击以“取消”按钮,然后才能再次执行相同的操作。
NSEvent addLocalMonitorForEventsMatchingMask。类似的行为2.
有什么建议吗?我猜方法2或3是正确的方法,只需要在鼠标上“按下”按钮。
答案 0 :(得分:12)
相当古老的线索。但这是我最近遇到的问题,所以如果我被允许贡献......
在我的情况下使用NSPopupButton不是一个选项。因为NSPopupButton创建了我自己不需要的NSMenu(我不知道如何让它消失)。
我找到了另一种方式。有可能在没有子类化的情况下更改默认的NSButton行为。只需使用NSControl类的-sendActionOn:
方法(-awakeFromNib
中的某个地方):
[_myButton sendActionOn:NSEventMaskLeftMouseDown];
现在,按钮的操作将在mouseDown事件上发送。 希望这会有所帮助。
答案 1 :(得分:4)
正如Peter所说,你可以使用NSPopUpButton。不太明显的是,您可以像使用NSButton一样配置按钮的样式,图像,标题等。
答案 2 :(得分:3)
Swift “语法”
myButton.sendAction(on: .leftMouseDown)
可替换地:
子类NSButton:
class ButtonDown: NSButton {
override func awakeFromNib() {
super.awakeFromNib()
self.sendAction(on: .leftMouseDown)
}
}