2010-10-21 2 views
2

Я не уверен, что я делаю неправильно. У меня есть NSTextView и я зарегистрирован как делегат для его атрибута textStorage. Когда я получаю -textStorageDidProcessEditing:notification:, я пытаюсь применить атрибуты к диапазонам символов в тексте. Это, конечно, «что-то» для персонажей, но не то, что я ожидаю ... они просто исчезают!Cocoa (Snow Leopard) Текст NSTextView'sStorage -setAttributes: диапазон: удаляет символы!

Пример тяжелого дистиллированного кода. Это должно убедиться, что второй символ в текстовом поле всегда красный:

-(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)]; 
    } 
} 

Вместо этого, как я печатаю последовательность «АБВГДЕЖ» я «а», а затем, когда я нажимаю «б», казалось бы, ничего не происходит, то когда я нажимаю «cdefg», типизация происходит как обычно, делая конечный результат «acdefg» ... «b» отсутствует!

Если я нахожусь в обратном пространстве, я должен ударить назад 7 раз, как будто «b» на самом деле есть, но просто не нарисован (курсор останавливается, когда он удаляет «b», а затем в следующем обратном пространстве удаляет «а», как ожидалось).

Если я применяю атрибуты к некоторому по умолчанию тексту в представлении с использованием того же метода -setAttributes:range:до, то это выглядит точно так, как я ожидаю.

Любые подсказки? Это похоже на довольно нормальное использование NSTextStorageDelegate :)

Я попытался позвонить -setNeedsDisplay в текстовое поле безрезультатно.

+0

я наткнулся на чужой код, и они сделали это с помощью менеджера макета Вид текста в: '[[[TextView textContainer] LayoutManager] setTemporaryAttributes: атрибуты forCharacterRange: range]; ' Теперь это работает, пока я не ударил ключ удаления, что вызывает исключение Exception. – d11wtq

+0

«Если я начну удалять backspace, я должен ударить назад 7 раз, как если бы« b »на самом деле там, но просто не рисовался (курсор останавливается, когда он удаляет« b », а затем в следующем обратном пространстве удаляет« a «как и ожидалось». «Это похоже на то, что происходит, когда приложение имеет исключение. Что-нибудь подобное в вашей консоли? –

ответ

4

Выяснил это. Работает NSTextStorage's -addAttribute:value:range. Я до сих пор не совсем понимаю, почему, но, по крайней мере, я могу справиться с этим и двигаться дальше.

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

Делает код немного менее загроможденным.

0

Я не уверен, насколько актуальна эта для вас после стольких лет, но я думаю, что причина этого в том, что вы были установкой атрибутов со словарем, который не содержит NSFontAttributeName, эффективно удаляя его из TextView.

Так что я думаю, что это должно работать:

-(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)]; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^