Pregunta

Estoy trabajando en un editor de texto cacao que utiliza un NSTextView. ¿Es posible cambiar el color de ciertas partes del texto?

¿Fue útil?

Solución

Usted debe agregar el controlador como el delegado del objeto NSTextStorage del NSTextView ([textView textStorage]) y luego poner en práctica el método delegado ‑textStorageDidProcessEditing:. Esto se llama cada vez que el texto cambia.

En el método delegado que necesita para obtener el objeto NSTextStorage actual desde el punto de vista de texto utilizando el método de -textStorage NSTextView. NSTextStorage es una subclase de NSAttributedString y contiene los contenidos atribuidos de la vista.

Su código a continuación, debe analizar la cadena y aplicar colorante a cualquier rangos de texto son interesantes para usted. Aplicar color a un rango usando algo como esto, que se aplicará un color amarillo a toda la cadena:

//get the range of the entire run of text
NSRange area = NSMakeRange(0, [textStorage length]);

//remove existing coloring
[textStorage removeAttribute:NSForegroundColorAttributeName range:area];

//add new coloring
[textStorage addAttribute:NSForegroundColorAttributeName 
                    value:[NSColor yellowColor] 
                    range:area];

La forma de analizar el texto depende de usted. NSScanner es una clase útil de usar al analizar el texto.

Tenga en cuenta que este método es de ninguna manera la forma más eficiente de manejar coloreado de sintaxis. Si los documentos que está editando son muy grandes lo más probable es que desee considerar la descarga del análisis de un hilo separado y / o ser inteligente acerca de qué secciones del texto se reparsed.

Otros consejos

de

Rob Keniger respuesta es bueno, pero para alguien que busca un ejemplo más concreto, aquí hay un resaltador de sintaxis corta que escribí que debe resaltar sintaxis de la plantilla expresiones regulares. Quiero \ a ser de color gris, con el carácter inmediatamente posterior a ser negro. QUIERO $ a ser de color rojo, con un carácter dígitos inmediatamente después del $ también a ser de color rojo. Todo lo demás debe ser de color negro. Aquí está mi solución:

Hice una clase de plantilla marcador, con un encabezado que se parece a esto:

@interface RMETemplateHighlighter : NSObject <NSTextStorageDelegate>

@end

I inicializarlo en el archivo de punta como un objeto y conectarlo a mi controlador de vista de una salida. En awakeFromNib del controlador de vista, tengo esta (donde replacer es mi salida NSTextView y templateHighlighter es la salida para la clase anterior):

self.replacer.textStorage.delegate = self.templateHighlighter;

Y mi aplicación es el siguiente:

- (void)textStorageDidProcessEditing:(NSNotification *)notification {
    NSTextStorage *textStorage = notification.object;
    NSString *string = textStorage.string;
    NSUInteger n = string.length;
    [textStorage removeAttribute:NSForegroundColorAttributeName range:NSMakeRange(0, n)];
    for (NSUInteger i = 0; i < n; i++) {
        unichar c = [string characterAtIndex:i];
        if (c == '\\') {
            [textStorage addAttribute:NSForegroundColorAttributeName value:[NSColor lightGrayColor] range:NSMakeRange(i, 1)];
            i++;
        } else if (c == '$') {
            NSUInteger l = ((i < n - 1) && isdigit([string characterAtIndex:i+1])) ? 2 : 1;
            [textStorage addAttribute:NSForegroundColorAttributeName value:[NSColor redColor] range:NSMakeRange(i, l)];
            i++;
        }
    }
}

Y esto es todo, un ejemplo completamente de trabajo. Había algunos detalles que me tenían un tropiezo para ~ 10 minutos, al igual que el hecho de que usted tiene que tomar la cadena de textStorage para acceder a los caracteres individuales ... tal vez esto salvar a otras personas a pocos minutos.

Te recomiendo que comience por leer el CocoaDev página sobre Sintaxis highlighing. Una gran cantidad de personas que han llegado con soluciones para diversos objetivos.

Si desea realizar el resaltado de sintaxis del código fuente, le sugiero que eche un vistazo a la UKSyntaxColoredTextDocument de Uli Kusterer .

Claro. Le puede dar la NSTextView un NSAttributedString, y algunas de las cosas que puede hacer con la cadena con atributos es aplicar colores a ciertos sub-intervalos de la cadena.

O puede buscar en Google y ver que un montón de personas que han hecho cosas con esto antes.

probablemente me recomiendan usar OkudaKit .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top