【问题标题】:How to set first responder for NSTextView in Swift?如何在 Swift 中为 NSTextView 设置第一响应者?
【发布时间】:2017-08-01 08:33:42
【问题描述】:

编辑:在 macOS 项目中

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

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

mainTextField.insertText(newStr, replacementRange: theRange)

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

然后我突出显示文本:

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

// select the range in field
mainTextField.selectedRange = range

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

其实我希望 NSTextView 成为第一响应者,这样我就可以直接复制选定的文本。

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

【问题讨论】:

  • 检查that,希望它能指导你。
  • 谢谢JFS,我一定会看的。

标签: swift xcode macos-sierra nstextview


【解决方案1】:

正确答案

在 AppKit 中,您需要:

if mainTextField.acceptsFirstResponder {
    mainTextField.window?.makeFirstResponder(mainTextField)
}

在这种情况下,不检查acceptsFirstResponder 可能是安全的,但也无妨。

原始答案 (UIKit)

您需要致电mainTextField.becomeFirstResponder()

【讨论】:

  • 谢谢你,戴夫,我试图把它放在 tableView tableViewSelectionDidChange 中,但我收到了这个错误:NSWindow: -_oldFirstResponderBeforeBecoming 在响应者的 -becomeFirstResponder 实现之外不是有效消息。 也许我必须输入另一部分代码?
  • Apple 说:“使用 NSWindow makeFirstResponder: 方法,而不是这个方法,使对象成为第一响应者。永远不要直接调用这个方法。”。
猜你喜欢
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多