How can you intercept pasting into a NSTextView to remove unsupported formatting?

主宰稳场 提交于 2019-12-19 00:08:25

问题


I'm trying to create a simple NSTextView-based window for simple WYSIWYG editing. However, I only want to allow certain types of formatting (e.g. Bold, Italic, Underline and a single heading type but no colors or different fonts.)

The issue is if I simply use NSTextView, someone can create or copy formatted text in another program, then simply paste it into that view and all that formatting goes with it, allowing things I'm not allowing, such as different fonts, colors, etc.

At best, I want to automatically strip out any formatting that my application doesn't support. At worst, I want to simply intercept the paste and change it to plain-text although they would have to then manually re-format it. But that's preferable to invalid formatting.

Note: Something similar has been asked here on SO multiple times, but they're usually referring to the web or using JavaScript/JQuery. I am specifically referring to using NSTextView in a Mac app so please, before simply marking this as a duplicate, make sure that's what the other question refers to. Thank you.


回答1:


In your NSTextView subclass:

  override func paste(_ sender: Any?) {
     pasteAsPlainText(sender)
  }



回答2:


[Edit: see Joshua Nozzi's comment!]

One possible solution would be to make your NSTextView implement this template method:

- (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
}

This way you don't have to handle any of the actual insertion/pasting but can mess with the pasteboard before the actual pasting.

You might also want to look into these methods of NSTextView dealing with the Pasteboard:

  • preferredPasteboardTypeFromArray:restrictedToTypesFromArray:
  • readSelectionFromPasteboard:
  • readSelectionFromPasteboard:type:
  • readablePasteboardTypes
  • writablePasteboardTypes
  • writeSelectionToPasteboard:type:
  • writeSelectionToPasteboard:types:
  • validRequestorForSendType:returnType:


来源:https://stackoverflow.com/questions/8198767/how-can-you-intercept-pasting-into-a-nstextview-to-remove-unsupported-formatting

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!