Swift:如何确定在 mouseDown 上单击了哪个控件

问题描述 投票:0回答:2

我正在尝试捕获(Cocoa with Storyboards)应用程序窗口中某些控件上的鼠标按下事件。

如果我在

mouseDown(with event: NSEvent)
类中覆盖
ViewController
,我将面临两个问题:

  1. 无法(直接)识别窗口中的哪个控件被单击。为此,我使用以下方法:

斯威夫特4:

    override func mouseDown(with event: NSEvent)
    {
        let point: NSPoint = event.locationInWindow
        let view: NSView = self.view.hitTest(point)!
        if type(of:view) == NSTextField.self // with tags is also fine
        {
            // do something with the control (in the example NSTextField)
            // (view as! NSTextField).backgroundColor = NSColor.systemPink
        }
    }

我有点困惑,为什么对于这样一个基本的 GUI 操作,没有为鼠标单击提供的“本机”事件处理程序(通过创建

@IBAction
)。 我是否遗漏了什么,或者这是捕获和处理鼠标按下事件的方法?

  1. 对于某些控件,例如
    NSLevelIndicator
    ,我重写的方法没有被调用。为什么?
swift cocoa mouseevent appkit
2个回答
0
投票

虽然基思的上述答案被否决了(被一些白痴),但基思是正确的。它适用于 NSView 而不是 NSViewController。尽管苹果公司表明 MouseDown 对两者都适用,但在一些复杂的设置中,它会产生错误,最终导致无法跟踪 mouseDown 事件。您可以做的是分配一个事件跟踪器并查看

self
是否被点击。

示例:

NSEvent.addLocalMonitorForEvents


-1
投票

您必须重写 NSView mouseDown,而不是 NSViewController mouseDown。

© www.soinside.com 2019 - 2024. All rights reserved.