gpt4 book ai didi

cocoa - Swift NSViewController 响应 mouseDown 事件,但不响应 keyDown 事件

转载 作者:行者123 更新时间:2023-12-03 16:05:18 32 4
gpt4 key购买 nike

我正在尝试使用 Swift 和 Cocoa 创建一个适用于 OS X 的应用程序。我希望应用程序能够响应关键事件,而不将焦点放在文本字段上/文本字段中。我在 Xcode 中创建了一个带有 Storyboard的新 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 {
}
}

}

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

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

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

提前致谢。

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

最佳答案

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

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

然而,“问题”是 acceptsFirstResponder 默认返回 NO。由于普通的 NSView 不会成为第一响应者,因此它不会接收键盘事件。因此,最简单的解决方案是子类化您的 NSView,重写 acceptsFirstResponder 以返回 YES

关于cocoa - Swift NSViewController 响应 mouseDown 事件,但不响应 keyDown 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30723756/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com