NSTextField insertText 方法已被弃用,替代品是啥?

Posted

技术标签:

【中文标题】NSTextField insertText 方法已被弃用,替代品是啥?【英文标题】:NSTextField insertText method is deprecated, what is the replacement?NSTextField insertText 方法已被弃用,替代品是什么? 【发布时间】:2017-07-04 02:23:26 【问题描述】:

我有一个 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?

【问题讨论】:

您为什么不阅读***.com/questions/32787814/… 上发布的 cmets ? 嗨 El Tomato,实际上我阅读了 bhaller 的评论:“使用 NSTextField,您需要使用文本字段的字段编辑器,即 NSTextView”但老实说,我没有理解它。 @Cue ,当 myTextField 已经有 44 时,您需要 insertText 的预期输出是多少? 嗨 RAJAMOHAN-S,当 i-beam 在 4 和 4 之间时,输出应该是 4Abc|4。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

如果您的 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)
        
    

【讨论】:

以上是关于NSTextField insertText 方法已被弃用,替代品是啥?的主要内容,如果未能解决你的问题,请参考以下文章

需要在 iMessage Extension 中的 insertText 方法上调用 didStartSending

需要在 iMessage Extension 中的 insertText 方法上调用 didStartSending

UITextView insertText 调用 shouldChangeTextInRange: replacementText:

NSTextField:公开其复制和粘贴方法

NSTextField + NSTimer

启用 codeview 时无法调用 editor.insertText