Я не уверен, что я делаю неправильно. У меня есть 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
в текстовое поле безрезультатно.
я наткнулся на чужой код, и они сделали это с помощью менеджера макета Вид текста в: '[[[TextView textContainer] LayoutManager] setTemporaryAttributes: атрибуты forCharacterRange: range]; ' Теперь это работает, пока я не ударил ключ удаления, что вызывает исключение Exception. – d11wtq
«Если я начну удалять backspace, я должен ударить назад 7 раз, как если бы« b »на самом деле там, но просто не рисовался (курсор останавливается, когда он удаляет« b », а затем в следующем обратном пространстве удаляет« a «как и ожидалось». «Это похоже на то, что происходит, когда приложение имеет исключение. Что-нибудь подобное в вашей консоли? –