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

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

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

при использовании встроенного 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, здесь и здесь, соответственно.

1 ответов


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

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