Как вы можете перехватить вставку в 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:
Другие вопросы по тегам