NSTextView изменить строку перед вставкой
Моя цель состоит в том, чтобы изменить строку - удалить все не-буквы (числа, пробелы и т. Д.) - перед вставкой ее в 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 ответ
Решение
Я думаю, что нашел ответ, я должен был добавить 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() - это рефакторированная функция, которая фильтрует входную строку.