如何在Swift中为NSTextView设置第一响应者?

Cue*_*Cue 2 xcode nstextview swift macos-sierra

编辑:在macOS项目中

我有一个简单的ViewController,它在状态项菜单应用程序上显示为弹出框。

我使用NSTableView更改视图文本的文本,具体取决于单击的项目。我使用的代码与此类似:

mainTextField.insertText(newStr, replacementRange: theRange)
Run Code Online (Sandbox Code Playgroud)

(我使用insertText的目的是将更改记录在撤消管理器中)

然后我突出显示文本:

// create the new NSRange
let range = NSRange(location: startRange, length: newStrLength)

// select the range in field
mainTextField.selectedRange = range
Run Code Online (Sandbox Code Playgroud)

所有操作均正常,但突出显示了文本,但使用了浅灰色而不是通常的天蓝色,表明该控件不是第一响应者。当我单击该字段时,选择消失。

实际上,我希望NSTextView成为第一响应者,因此我可以直接复制所选文本。

编辑:如果我按键盘上的Tab键,我将使textView成为第一响应者(灰色选择变为标准的天蓝色)。

Dav*_*ton 6

正确答案

在AppKit中,您需要:

if mainTextField.acceptsFirstResponder {
    mainTextField.window?.makeFirstResponder(mainTextField)
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不进行检查可能是安全的acceptsFirstResponder,但也不会造成伤害。

原始答案(UIKit

您需要致电mainTextField.becomeFirstResponder()

  • 苹果公司说:“使用NSWindow的makeFirstResponder:方法而不是此方法,使对象成为第一响应者。切勿直接调用此方法。” (2认同)