Какао (снежный барс) textStorage -setAttributes NSTextView: диапазон: удаляет символы - PullRequest
2 голосов
/ 22 октября 2010

Я не уверен, что я делаю неправильно.У меня есть NSTextView и я зарегистрирован в качестве делегата для его атрибута textStorage.Когда я получаю -textStorageDidProcessEditing:notification:, я пытаюсь применить атрибуты к диапазонам символов в тексте.Это, безусловно, «что-то» для символов, но не то, что я ожидаю ... они просто исчезают!

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

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

Вместо этого, когда я набираю последовательность «abcdefg», я получаю «a», затем, когда я нажимаю «b», похоже, ничего не происходитзатем, когда я нажимаю "cdefg", печатание происходит как обычно, в результате чего конечный результат "acdefg" ... пропускается "b"!

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

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

Есть какие-нибудь подсказки?Похоже, довольно обычное использование NSTextStorageDelegate:)

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

Ответы [ 2 ]

4 голосов
/ 22 октября 2010

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

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

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

0 голосов
/ 13 декабря 2014

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

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

-(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)];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...