2011-11-20 6 views
6

Estoy tratando de crear una ventana simple basada en NSTextView para la edición WYSIWYG simple. Sin embargo, solo quiero permitir ciertos tipos de formato (por ejemplo, negrita, cursiva, subrayado y un solo tipo de encabezado pero no colores o fuentes diferentes).¿Cómo se puede interceptar el pegado en un NSTextView para eliminar el formato no compatible?

El problema es si simplemente uso NSTextView, alguien puede crear o copiar formateado texto en otro programa, simplemente péguelo en esa vista y todo ese formato va con él, permitiendo cosas que no estoy permitiendo, como diferentes fuentes, colores, etc.

En el mejor de los casos, quiero eliminar automáticamente cualquier formato que mi aplicación no admita. En el peor de los casos, quiero simplemente interceptar el pegado y cambiarlo a texto sin formato, aunque tendrían que volver a formatearlo manualmente. Pero eso es preferible al formato no válido.

Nota: Algo similar se ha preguntado aquí en SO varias veces, pero generalmente se están refiriendo a la web o usando JavaScript/JQuery. Me refiero específicamente al uso de NSTextView en una aplicación de Mac así que, por favor, antes de simplemente marcar esto como un duplicado, asegúrese de que a eso se refiera la otra pregunta. Gracias.

Respuesta

1

En la subclase NSTextView:

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

[Editar: véase el comentario de Joshua Nozzi]

Una posible solución sería la de hacer que su NSTextView poner en práctica este método plantilla:

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

De esta manera usted no tiene que manejar cualquier de la inserción/pegado real, pero puede meterse con la mesa de trabajo antes de pegarla.

También puede que desee ver en estos métodos de NSTextView se ocupan de la mesa de trabajo:

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

yo evitaría jugar con el contenido real de cartón. El usuario copió el texto formateado, por lo que no debería destruirlo. Utilice los otros métodos mencionados al final de esta respuesta (-readSelectionFromPasteboard: o -readSelectionFromPasteboard: type:). –

Cuestiones relacionadas