【问题标题】:NSTextView modify string before pastingNSTextView 在粘贴前修改字符串
【发布时间】:2018-12-11 17:49:04
【问题描述】:

我的目标是在将字符串粘贴到 NSTextView 之前修改字符串 - 删除所有非字母(数字、空格等)。

通过link,我想出了以下代码:

override func paste(_ sender: Any?) {
    let pasteboard = NSPasteboard.general
 // receive string from pasteboard
    if let pasteboardString = pasteboard.string(forType: .string) {
        let lettersOnly = CharacterSet.letters

     // filter the incoming string
        let lettersOnlyString = String(pasteboardString.unicodeScalars.filter { lettersOnly.contains($0) })

     // put back filtered string into pasteboard
        pasteboard.setString(lettersOnlyString, forType: .string)
        super.paste(sender)

     // put back initial formatted string
        pasteboard.setString(pasteboardString, forType: .string)
    }
}

lettersOnlyString确实是修改后的字符串,但最后还是粘贴了原始字符串,我仍然看到所有非字母字符。

我在这里错过了什么,也许这不是要走的路?也许我需要为此覆盖另一种方法?

【问题讨论】:

    标签: macos nstextview nspasteboard


    【解决方案1】:

    我想我找到了答案,我必须在pasteboard.setString之前添加pasteboard.clearContents()

    为了完整起见,这是工作代码:

    override func paste(_ sender: Any?) {
        let pasteboard = NSPasteboard.general
    
    // get string from pasteboard
        if let pasteboardString = pasteboard.string(forType: .string) {
         // remove formatting from string
            let lettersOnly = CharacterSet.letters
            let lettersOnlyString = String(pasteboardString.unicodeScalars.filter { lettersOnly.contains($0) })
    
         // put modified string on pasteboard
            pasteboard.clearContents()
            pasteboard.setString(lettersOnlyString, forType: .string)
    
         // paste string from pasteboard as plain text
            pasteAsPlainText(sender)
    
         // put original string back on pasteboard
            pasteboard.clearContents()
            pasteboard.setString(pasteboardString, forType: .string)
        }
    }
    

    更新:

    还可以更简单:

    override func paste(_: Any?) {
        let pasteboard = NSPasteboard.general
        guard let pasteboardString = pasteboard.string(forType: .string),
            let validatedInput = validateInput(pasteboardString)
        else { return }
    
        insertText(validatedInput, replacementRange: NSMakeRange(NSNotFound, 0))
    }
    

    其中 validateInput() 是一个重构函数,用于过滤输入字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      相关资源
      最近更新 更多