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

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

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

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

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

【问题讨论】:

    标签: cocoa formatting paste nstextview reformat


    【解决方案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: )。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 2010-09-10
      • 2012-01-02
      • 2011-08-27
      相关资源
      最近更新 更多