9

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

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

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

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

4

2 回答 2

4

在您的 NSTextView 子类中:

  override func paste(_ sender: Any?) {
     pasteAsPlainText(sender)
  }
于 2016-09-26T18:45:14.003 回答
3

[编辑:见 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:
于 2011-11-20T01:35:03.720 回答