不推荐使用NSTextField insertText方法,有什么替代方法?

时间:2017-07-04 02:23:27

标签: swift cocoa nstextfield

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

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

[编辑] 当在字段中有123 | 45(" |"表示文本插入点)时,输出应为123Abc | 45.

不幸的是,因为它被弃用了所以不能工作。这是documentation。什么是替代品?

请注意,此问题适用于NSTextField而不是NSTextView,其中有一个问题:NSTextView's insertText method is deprecated in OS X v10.11. What is the replacement?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

如果您的textField具有焦点(是第一个响应者),则任何响应者方法(例如insertText:或inserText:replacementRange:)都可以完成工作。问题是当您要使textField成为第一响应者时(它将丢失/重置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)
        }
    }
}