如何拦截粘贴到 NSTextView 以删除不支持的格式?

Posted

技术标签:

【中文标题】如何拦截粘贴到 NSTextView 以删除不支持的格式?【英文标题】:How can you intercept pasting into a NSTextView to remove unsupported formatting? 【发布时间】:2012-01-02 04:22:00 【问题描述】:

我正在尝试为简单的所见即所得编辑创建一个简单的基于 NSTextView 的窗口。但是,我只想允许某些类型的格式(例如粗体、斜体、下划线和单一的标题类型,但没有颜色或不同的字体。)

问题是,如果我只是使用 NSTextView,有人可以在另一个程序中创建或复制格式化文本,然后只需将其粘贴到该视图中,所有格式化都随之而来,允许我不允许的事情,例如不同的字体、颜色等。

充其量,我想自动删除我的应用程序不支持的任何格式。在最坏的情况下,我想简单地拦截粘贴并将其更改为纯文本,尽管他们必须手动重新格式化它。但这比无效格式更可取。

注意:在 SO 上已经多次询问过类似的问题,但他们通常指的是 Web 或使用 JavaScript/JQuery。我特别指的是在 Mac 应用程序中使用 NSTextView,所以在简单地将其标记为重复之前,请确保这是另一个问题所指的内容。谢谢。

【问题讨论】:

【参考方案1】:

在你的 NSTextView 子类中:

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

【讨论】:

【参考方案2】:

[编辑:见 Joshua Nozzi 的评论!]

一种可能的解决方案是让您的 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:

【讨论】:

我会避免弄乱实际的粘贴板内容。用户复制了格式化的文本,所以你不应该为他们销毁它。使用此答案底部提到的其他方法( -readSelectionFromPasteboard: 或 -readSelectionFromPasteboard:type: )。

以上是关于如何拦截粘贴到 NSTextView 以删除不支持的格式?的主要内容,如果未能解决你的问题,请参考以下文章

NSTextView 提取原始文本内容

如何使用显式 NSLayoutManager、NSTextStorage、NSTextContainer 以编程方式设置 NSTextView?

如何以编程方式将文本作为NSTextView中的超链接? Swift 4,Xcode 9.4

如何从 NSAttributedString 获取图像数据

当新的 NSTextView 成为 FirstResponder (MacOS) 时如何移动光标?

NSTextView 和/或 NSScrollView 的自动调整大小