textStorage -setAttributes cacao (Snow Leopard) de NSTextView: Rango: elimina personajes!

StackOverflow https://stackoverflow.com/questions/3992214

Pregunta

No estoy seguro de lo que estoy haciendo mal. Tengo un NSTextView y estoy registrado como delegado de su atributo textStorage. Cuando recibo -textStorageDidProcessEditing:notification: Estoy intentando aplicar atributos a los rangos de caracteres dentro del texto. Ciertamente hace "algo" a los personajes, pero no lo que espero ... que acaba de desaparecer!

A ejemplo de código en gran medida destilada. Esto debe asegurarse de que el segundo carácter en el campo de texto siempre está en rojo:

-(void)textStorageDidProcessEditing:(NSNotification *)notification {
  NSTextStorage *textStorage = [textView textStorage];
  if ([[textStorage string] length] > 1) {
    NSColor *color = [NSColor redColor];
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:color, NSForegroundColorAttributeName, nil];
    [textStorage setAttributes:attributes range:NSMakeRange(1, 1)];
  }
}

En lugar de ello, mientras se escribe la secuencia "abcdefg" Me "a", entonces cuando me golpeó "b" aparentemente no pasa nada, entonces cuando me golpeó "cdefg" tipificación se produce de forma normal, por lo que el resultado final "acdefg". .. la "b" se ha omitido!

Si comienzo a golpear la tecla de retroceso que tiene que golpear la tecla de retroceso 7 veces, como si la "b" es en realidad existe, pero no está elaborando (cursor puestos, ya que elimina el "B", a continuación, en la siguiente corrección borra el " un" como se esperaba).

Si aplico atributos de un texto por defecto en la vista usando el mismo método -setAttributes:range: antes de la vista se dibuja a continuación, que hace exactamente lo que espero.

¿Alguna pista? Parece un uso bastante normal de un NSTextStorageDelegate:)

He intentado llamar -setNeedsDisplay en el campo de texto en vano.

¿Fue útil?

Solución

descubierto. El uso de las obras de -addAttribute:value:range NSTextStorage. Todavía no entiendo bien por qué, pero al menos puedo superarlo y seguir adelante.

-(void)textStorageDidProcessEditing:(NSNotification *)notification {
  // ... SNIP ...
  [textStorage addAttribute:NSForegroundColorAttributeName
                      value:[NSColor redColor]
                      range:NSMakeRange(1, 1)];
}

Hace que el código un poco más despejado también.

Otros consejos

No estoy seguro de qué tan relevante es para ti después de tantos años, pero creo que la razón para ello era que eras el ajuste de atributos con un diccionario que no contiene NSFontAttributeName, eliminando de forma eficaz se del TextView.

Así que creo que esto debería funcionar:

-(void)textStorageDidProcessEditing:(NSNotification *)notification {
  NSTextStorage *textStorage = [textView textStorage];
  if ([[textStorage string] length] > 1) {
    NSColor *color = [NSColor redColor];
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:color, NSForegroundColorAttributeName, [NSFont ...whatever...], NSFontAttributeName, nil];
    [textStorage setAttributes:attributes range:NSMakeRange(1, 1)];
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top