Недопустимый индекс глифа при настройке layoutManager viewController для подкласса NSTextStorage

Моя цель — использовать TextKit для выделения курсивом, установки размера текста и т. д. определенных слов.

Для начала я только пытаюсь выделить символ в своей текстовой строке. Будучи новичком в TextKit (и, честно говоря, в программировании в целом), я следую теме подсветки синтаксиса в выпуске № 5 obc.io.

При использовании NSLayoutManager, встроенного в созданный мной UITextView, мой текст появляется на экране без исключений. Когда я устанавливаю свой UITextView в качестве менеджера компоновки моего подкласса NSTextStorage в моем контроллере представления (ниже), я получаю ошибки для исключения для недопустимого индекса (ов) глифа.

_textStorage = [BBRSyntaxHighlightTextStorage new]; 
[_textStorage addLayoutManager: self.readerTextView.layoutManager];

Вывод консоли ниже:

_NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 528
2013-12-01 15:23:24.949 BibleReader[6077:70b] !!! _NSGlyphTreeInvalidateGlyphsForCharacterRange invalid char range 1
2013-12-01 15:23:24.956 BibleReader[6077:70b] !!! _NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 528
2013-12-01 15:23:24.957 BibleReader[6077:70b] !!! _NSGlyphTreeInvalidateGlyphsForCharacterRange invalid char range 1
2013-12-01 15:23:24.957 BibleReader[6077:70b] !!! _NSGlyphTreeInvalidateGlyphsForCharacterRange character count mismatch
2013-12-01 15:23:24.958 BibleReader[6077:70b] !!! _NSLayoutTreeLineFragmentRectForGlyphAtIndex invalid glyph index 4040
2013-12-01 15:23:24.959 BibleReader[6077:70b] !!! _NSGlyphTreeInvalidateGlyphsForCharacterRange invalid char range 1

Я много раз читал Руководство по текстовому программированию Apple и думаю, что понимаю, как устанавливается текстовая система, но понятия не имею, почему количество моих глифов превышает количество глифов...

Я создал gist для своего подкласса viewController и NSTextStorage, здесь и здесь соответственно.


person jefffreyallen    schedule 01.12.2013    source источник


Ответы (1)


Похоже, ваш менеджер компоновки не был должным образом удален из исходного объекта NSTextStorage. Вызовите [self.readerTextView.textStorage removeLayoutManager:self.readerTextView.layoutManager], прежде чем добавить менеджер компоновки в свой собственный подкласс хранилища текста.

В общем, я обнаружил, что TextKit плохо работает при смешивании nib/xib/storyboard, созданных UITextViews, с пользовательскими подклассами объектов TextKit. Вы можете обойти некоторые из них, переопределив - (id)awakeAfterUsingCoder:(NSCoder *)aDecoder на UITextView и создав текстовую систему, используя нужные вам классы, но обычно я бы рекомендовал придерживаться создания пользовательской текстовой системы в коде.

person Ben Lachman    schedule 11.12.2013
comment
Мне удалось заставить это работать без необходимости переопределять awakeAfterUsingCoder. Удаление layoutManager перед добавлением инициализации подкласса textStorage и добавление layoutManager readerTextView решило мою проблему; текстовое представление отображает текст на экране, используя мое собственное хранилище textStorage. - person jefffreyallen; 13.01.2014
comment
Вау, removeLayoutManager: помог мне. Большое спасибо! - person Vadim; 31.03.2015