【问题标题】:Swift NSViewController responds to mouseDown event, but not keyDown eventSwift NSViewController 响应 mouseDown 事件,但不响应 keyDown 事件
【发布时间】:2015-06-09 05:37:45
【问题描述】:

我正在尝试使用 Swift 和 Cocoa 为 OS X 创建一个应用程序。我希望应用程序响应关键事件,而不会将焦点放在文本字段上。我在 Xcode 中创建了一个带有故事板的新 Cocoa 项目,并将 ViewController.swift 类修改为以下内容:

import Cocoa

class ViewController: NSViewController {

    override func mouseDown(theEvent: NSEvent) {
        println( "Mouse Clicked" )
    }

    override func keyDown(theEvent: NSEvent) {
        println( "Key Pressed" )
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override var representedObject: AnyObject? {
        didSet {
        }
    }

}

当我运行程序时,单击窗口时会得到控制台输出,但按任意键时不会得到任何控制台输出。

所以我的问题是:为什么我的程序响应鼠标事件而不响应按键事件?我需要执行哪些额外步骤才能使键事件像鼠标事件一样工作?

看来我的视图控制器在响应者链中,因为它拦截了鼠标事件,所以这似乎不是问题。我在 SE 上找到了其他答案,说我需要继承 NSView 或 NSWindow 类。不这样做是否可以获取关键事件?

提前致谢。

编辑:除了接受的答案之外,Swift - Capture keydown from NSViewController 是一个很棒的、清晰的解决方案。

【问题讨论】:

  • 您能否提供您的代码来继承 NSView?我需要做同样的事情,我相信。我正在尝试按下箭头键。
  • 这个问题的最佳答案在这里:stackoverflow.com/questions/32446978/…我发布这个是因为给出的例子都没有真正帮助我,我在上面的帖子中得到了一个非常简单的答案,即使在Xcode 8 和 Swift 3。
  • @jvarela 这是一个很好的链接。谢谢。我会更新我的问题以链接到它。

标签: cocoa


【解决方案1】:

您观察到的差异源于 Cocoa 处理鼠标事件和键盘事件的方式略有不同。在事件派发过程的早期,所有的事件都被系统发送到NSWindow对象。对于鼠标事件,NSWindow 将它们转发到用户单击的视图;对于键盘事件,NSWindow 会将它们转发给当前按键窗口的第一响应者。

NSWindow 的初始第一响应者是窗口本身。当用户点击NSView 时,NSWindow 将尝试通过发送acceptsFirstResponder 消息使该视图成为第一响应者。如果返回YES,则被点击的视图将成为第一响应者。

然而,“陷阱”是acceptsFirstResponder 默认返回NO。作为一个普通的NSView 不会成为第一响应者,它不会接收键盘事件。所以最简单的解决方案是继承 NSView,覆盖 acceptsFirstResponder 以返回 YES。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多