2011-11-20 61 views
6

我想創建一個簡單的基於NSTextView的窗口進行簡單的所見即所得的編輯。但是,我只想要允許某些類型的格式(例如粗體,斜體,下劃線和單個標題類型,但不包含顏色或不同的字體)。如何攔截粘貼到NSTextView以刪除不支持的格式?

問題是如果我只是使用NSTextView,某人可以創建或複製格式文本在另一個程序中,然後只需將其粘貼到該視圖中,並使用它的所有格式,允許我不允許的內容,例如不同的字體,顏色等。

充其量,我想自動剝離任何我的應用程序不支持的格式。在最壞的情況下,我想簡單地攔截粘貼並將其更改爲純文本,儘管它們必須手動重新格式化它。但是這比格式無效更可取。

注意:這裏曾經多次提到類似的東西,但它們通常指的是Web或使用JavaScript/JQuery。我特別指的是在Mac應用程序中使用NSTextView,因此請在將其標記爲重複之前,確保這是另一個問題所指的內容。謝謝。

回答

1

在你NSTextView的子類:

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

[編輯:見約書亞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:
+6

我會避免與實際紙板內容搞亂。用戶複製了格式化的文本,所以你不應該爲它們銷燬它。使用本答案底部提到的其他方法(-readSelectionFromPasteboard:或-readSelectionFromPasteboard:type:)。 –