【问题标题】:How to send a key event to an NSTextField that does not have focus in swift如何将关键事件发送到没有焦点的 NSTextField
【发布时间】:2015-02-01 08:49:58
【问题描述】:

我有一个包含 NSTableView 和 NSTextField 的视图。表格视图具有焦点。我想使用文本字段作为表格视图的过滤器。有什么方法可以将由表视图捕获的按键事件发送到 NSTextField?

这是我拥有的 keyDown 函数,我想将事件发送到 switch 语句的默认处理程序中的文本字段。

override func keyDown(theEvent: NSEvent) {
    let s   =   theEvent.charactersIgnoringModifiers!
    let s1  =   s.unicodeScalars
    let s2  =   s1[s1.startIndex].value
    let s3  =   Int(s2)
    switch s3 {
        case NSUpArrowFunctionKey:
            self.previous()
            return
        case NSDownArrowFunctionKey:
            self.next()
            return
        default:
            // this appends the text to the textField, Is there a way to send theEvent to the textField?
            textField.stringValue = textField.stringValue + s;

            // textField.keyDown(theEvent) // this does not work
            break
    }
}

我希望不必强制用户将焦点更改为文本字段来过滤表格视图结果。

【问题讨论】:

  • 文本字段不处理关键事件。当它们获得焦点时,一个单独的文本视图将添加到与文本字段重叠的窗口中。该文本视图,称为field editor,处理关键事件和其他事情(例如,编辑菜单项)。文本字段没有。因此,当文本字段没有焦点时,没有什么可以处理此类事件。 Mac UI 约定是使用单独的NSSearchField 并在表格中进行类型选择。
  • 感谢您的解释。我决定将 NSTextField 作为 firstResponder 并使用 doCommandBySelector 在 NSTextFieldDelegate 控制函数中处理我想要的事件。

标签: cocoa swift nstextfield


【解决方案1】:

据我了解,-keyDown: 被发送到firstResponder,在这种情况下是表格视图。

我不喜欢这个想法,我会以不同的方式实现,但您可以尝试将文本字段插入响应者链和表格视图上方的位置。您必须对文本字段进行子类化并实现mouseDown 以捕获事件,并且您还必须更改表格视图鼠标按下的实现,以便它不会捕获文本字段的事件。这太复杂了。

为什么不简单地设置文本字段的目标/动作并在事件循环之外处理用户输入?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    相关资源
    最近更新 更多