如何拦截粘贴到 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 以删除不支持的格式?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用显式 NSLayoutManager、NSTextStorage、NSTextContainer 以编程方式设置 NSTextView?
如何以编程方式将文本作为NSTextView中的超链接? Swift 4,Xcode 9.4