Как вы можете перехватить вставку в NSTextView для удаления неподдерживаемого форматирования?
Я пытаюсь создать простое окно на основе NSTextView для простого редактирования WYSIWYG. Однако я хочу разрешить только определенные типы форматирования (например, полужирный, курсив, подчеркивание и один тип заголовка, но не использовать цвета или другие шрифты).
Проблема заключается в том, что если я просто использую NSTextView, кто-то может создать или скопировать отформатированный текст в другой программе, а затем просто вставить его в это представление, и все это форматирование идет с ним, позволяя вещи, которые я не разрешаю, такие как различные шрифты, цвета, и т.п.
В лучшем случае я хочу автоматически удалить любое форматирование, которое не поддерживает мое приложение. В худшем случае я хочу просто перехватить вставку и изменить ее на обычный текст, хотя им придется затем вручную переформатировать ее. Но это предпочтительнее неверного форматирования.
Примечание. Нечто подобное было задано здесь в SO несколько раз, но они обычно ссылаются на Интернет или используют JavaScript/JQuery. Я имею в виду использование NSTextView в приложении Mac, поэтому, прежде чем просто пометить это как дубликат, убедитесь, что это то, к чему относится другой вопрос. Спасибо.
2 ответа
В вашем подклассе NSTextView:
override func paste(_ sender: Any?) {
pasteAsPlainText(sender)
}
[Редактировать: см. Комментарий Джошуа Ноцци!]
Одним из возможных решений было бы заставить ваш NSTextView реализовать этот метод шаблона:
- (void)paste:(id)sender {
NSPasteboard *pb = [NSPasteboard generalPasteboard];
//receive formatted string from pasteboard
//remove formatting from string
//put back plaintext string into pasteboard
[super paste:sender];
//put back initial formatted string
}
Таким образом, вам не нужно обрабатывать фактическую вставку / вставку, но вы можете связываться с монтажной панелью до фактической вставки.
Вы также можете посмотреть на эти методы NSTextView
работа с картоном:
preferredPasteboardTypeFromArray:restrictedToTypesFromArray:
readSelectionFromPasteboard:
readSelectionFromPasteboard:type:
readablePasteboardTypes
writablePasteboardTypes
writeSelectionToPasteboard:type:
writeSelectionToPasteboard:types:
validRequestorForSendType:returnType: