【问题标题】:How can I make the Tab key move focus out of a NSTextView?如何使 Tab 键将焦点移出 NSTextView?
【发布时间】:2022-05-14 16:57:01
【问题描述】:

我正在使用 NSTextView 来允许多行输入。但是,由于我的应用的性质,用户在按下 TAB 键时会更舒服地移动到下一个输入元素。

如何让 TAB 退出 NSTextView,同时保持 Enter 键的换行行为?

【问题讨论】:

    标签: objective-c cocoa nstextview


    【解决方案1】:

    您可以在文本视图的委托中实现-textView:doCommandBySelector:

    - (BOOL)textView:(NSTextView *)aTextView doCommandBySelector:(SEL)aSelector {
        if (aSelector == @selector(insertTab:)) {
            [[aTextView window] selectNextKeyView:nil];
            return YES;
        }
    
        return NO;
    }
    

    http://developer.apple.com/documentation/Cocoa/Reference/NSTextViewDelegate_Protocol

    【讨论】:

    • 非常好的方法。您也可以检查insertBacktab: 并以类似方式致电selectPreviousKeyView:
    【解决方案2】:

    您需要在子类中实现它。

    我为Translate Text 写了这样一个子类。欢迎您在its BSD license 下使用它。这是the headerthe implementation file

    ...同时保持 Enter 键的换行行为?

    我的主要目的是在用户按下 Enter 时向目标发送一个动作,并且我还让它从视图中删除焦点。但是,两者都是代码中的显式语句;您可以简单地注释掉该代码或删除它。

    【讨论】:

    • Enter 的键码在标题中定义为 kVK_ANSI_KeypadEnter。同样,Tab 是 kVK_Tab。
    【解决方案3】:

    Wevah 和 Quinn 答案的 Swift 版本:

    func textView(_ textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
        switch commandSelector {
        case #selector(NSResponder.insertTab(_:)):
            textView.window?.selectNextKeyView(nil)
            return true
        case #selector(NSResponder.insertBacktab(_:)):
            textView.window?.selectPreviousKeyView(nil)
            return true
        default:
            return false
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      相关资源
      最近更新 更多