4

介绍

当我的自定义NSTextField处于“文本编辑模式”并且field editor已经放置在它前面时,因为firstResponder我不再通过NSTextField.keyDown(...). 我了解击键现在正在通过field editor. 大多数在线建议是在 custom 的委托中覆盖以下方法NSTextField

control(_:textView:doCommandBySelector:)

我确实覆盖了这个方法,但它似乎没有被调用?请参见下面的代码:

class FocusDelegate: NSObject, NSTextFieldDelegate{

    func control(control: NSControl, textView: NSTextView, doCommandBySelector commandSelector: Selector) -> Bool {

        println("FocusDelegate")
        if commandSelector == Selector("cancelOperation:"){
            println("cancelOperation")
            control.abortEditing()
            return true
        }
        return false
    }
}

我唯一要做的另一件事是将我的自定义委托设置NSTextField为上述类的实例。我也尝试将上面的方法直接放入自定义NSTextField类中——它不会导致任何错误,但也不会被调用。

问题

  1. 在让代表打电话上班时,我在上面遗漏了什么?
  2. 除了创建我自己的自定义字段编辑器之外,这是唯一的方法吗?可以textDidChange(notification: NSNotification)不被询问以产生按下的键吗?
  3. 在使用control(_:textView:doCommandBySelector:)委托方法时,我如何捕获没有标准键绑定的键的按下。特别是,我想截取不映射到任何标准选择器的组合键“shift+enter”。(隐含的问题:你只能映射到 NSResponder 中的标准键操作方法吗?)
4

2 回答 2

3

我相信我已经更清楚地了解了NSTextField它的代表及其 fieldEditor 及其代表的工作方式。是的,每个人都有自己的代表,并且NSTextField会自动设置为fieldEditor.

我正在向主机添加一个代表NSTextField。当is时,这不会被调用,这是我所关心的。这也不是上述场景的重要代表。fieldEditorfirstResponder

似乎有用的是使NSTextField符合NSTextViewDelegate协议并专门覆盖该方法:

 func textView(textView: NSTextView, shouldChangeTextInRange affectedCharRange: NSRange, replacementString: String) -> Bool

捕获各种按键。

在这种情况下,通知textDidChange(notification: NSNotification)不可用,因为它是在按键之后报告的。

于 2015-03-09T19:14:28.183 回答
0

拦截按下的键textView:shouldChangeTextInRange:replacementString:并不理想,因为这被称为相当晚,并且例如在用户从剪贴板粘贴时也会被调用。

一种可能更简洁的方法是拦截textView:doCommandBySelector:,它会被各种特殊键调用,例如 tab、光标、return 和 enter,然后您将获得特定的选择器,让您确定调用了哪个特殊键。

但是,对于某些键,例如 Return ( CR) 和 Enter ( ETX),您无法区分它们,因为它们都使用相同的 "insertNewline:" 选择器。

在这种情况下,您可以检查当前处理的事件是否为 keydown 事件,如果是,则检查它是哪个键。

这是一个快速测试代码,可让您监控选择器名称和相关键码:

-(BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
{
    NSEvent *ev = self.view.window.currentEvent;
    NSLog (@"selector: %s, key: %d", commandSelector, (int)ev.keyCode);
    return NO;
}
于 2022-01-23T17:23:13.757 回答