2011-11-20 8 views
6

Sto provando a creare una semplice finestra basata su NSTextView per la semplice modifica WYSIWYG. Tuttavia, desidero solo consentire alcuni tipi di formattazione (ad esempio Grassetto, Corsivo, Sottolineato e un singolo tipo di titolo ma senza colori o caratteri diversi.)Come si può intercettare l'incollatura in un NSTextView per rimuovere la formattazione non supportata?

Il problema è se io uso semplicemente NSTextView, qualcuno può creare o copiare formattato testo in un altro programma, quindi semplicemente incollarlo in quella vista e tutta quella formattazione, consentendo le cose che non sto permettendo, come font, colori, ecc.

Nel migliore dei casi, voglio escludere automaticamente qualsiasi formattazione che la mia applicazione non supporta. Nel peggiore dei casi, voglio semplicemente intercettare la pasta e cambiarla in testo normale, anche se dovevano poi riformattarla manualmente. Ma è preferibile una formattazione non valida.

Nota: Qualcosa di simile è stato chiesto qui su SO più volte, ma di solito si riferiscono al web o utilizzano JavaScript/JQuery. Mi riferisco in particolare all'utilizzo di NSTextView in un'app per Mac, quindi per favore, prima di contrassegnarlo come duplicato, assicurati che sia a questo che si riferisce l'altra domanda. Grazie.

risposta

1

nella sottoclasse NSTextView:

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

[Edit: vedi il commento di Joshua Nozzi]

Una possibile soluzione potrebbe essere quella di rendere il vostro NSTextView implementare questo metodo modello:

- (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 
} 

In questo modo non c'è bisogno di gestire qualsiasi dell'inserimento/incolla effettivo, ma può rovinare con il cartone prima dell'incollatura effettiva.

Si potrebbe anche voler guardare in questi metodi di NSTextView si occupano del cartone:

  • preferredPasteboardTypeFromArray:restrictedToTypesFromArray:
  • readSelectionFromPasteboard:
  • readSelectionFromPasteboard:type:
  • readablePasteboardTypes
  • writablePasteboardTypes
  • writeSelectionToPasteboard:type:
  • writeSelectionToPasteboard:types:
  • validRequestorForSendType:returnType:
+6

Eviterei scherzi con il contenuto effettivo di cartone. L'utente ha copiato il testo formattato, quindi non devi distruggerlo per loro. Utilizza gli altri metodi indicati in fondo a questa risposta (-readSelectionFromPasteboard: or -readSelectionFromPasteboard: digita:). –

Problemi correlati