NSTextView изменить строку перед вставкой - PullRequest
0 голосов
/ 11 декабря 2018

Моя цель состоит в том, чтобы изменить строку - удалить все не-буквы (цифры, пробелы и т. Д.) - прежде чем вставлять ее в NSTextView.

Через эту ссылку я пришелсо следующим кодом:

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 действительно измененная строка, но в конце концов исходная строка все равно вставляется, я все равно вижу все не-буквенные символы.

Чтоя здесь скучаю, может быть, это не тот путь?Может быть, мне нужно переписать другой метод для этого?

1 Ответ

0 голосов
/ 11 декабря 2018

Я думаю, что нашел ответ, мне пришлось добавить pasteboard.clearContents() до pasteboard.setString.

Просто для полноты, это рабочий код:

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 () - это рефакторированная функция, которая фильтруетвходная строка.

...