NSTextField insertText 方法已弃用,替代方法是什么?

NSTextField insertText method is deprecated, what is the replacement?

我有一个 NSTextField,我想在其中的插入点输入文本。我有一个不会产生错误的代码:

    let str = "Abc" 
    myTextField.insertText(str)

[编辑] 当字段中有123|45(“|”代表文本插入点)时,输出应该是123Abc|45.

不幸的是,它已被弃用,因此无法使用。这里是documentation。什么是替代品?

请注意,这个问题是针对 NSTextField 而不是 NSTextView,这里有一个问题:

获取文本字段所在 window 的字段编辑器,然后在其上使用 insertText(_:, replacementRange:)

let textfield = NSTextField()...
if let fieldEditor = textfield.window?.fieldEditor(false, for: textfield) as? NSTextView {
    fieldEditor.insertText("abc", replacementRange: fieldEditor.selectedRange())
}

澄清一下:这需要文本字段具有输入焦点。如果其他某个字段具有输入焦点,则字段编辑器将在此处插入文本。

如果您的 textField 有焦点(是第一响应者),那么任何响应者方法,如 insertText: 或 inserText:replacementRange: 都可以完成这项工作。问题是当你想让 textField 成为第一响应者时(它将 lose/reset selectionRange)。

func appendText(_ text: String, for textField: NSTextField) {
    makeFirstResponder(textField)
    if let fieldEditor = (textField.currentEditor() as? NSTextInputClient) {
        fieldEditor.insertText(text, replacementRange: fieldEditor.selectedRange())
    }
}

func makeFirstResponder(_ textField: NSTextField) {
    if textField.window?.firstResponder != textField.currentEditor() {
        textField.window?.makeFirstResponder(textField)
        if let length = textField.currentEditor()?.string.count {
            textField.currentEditor()?.selectedRange = NSMakeRange(length, 0)
        }
    }
}