Недопустимый индекс глифа при настройке 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 и построение текстовой системы с использованием классов, которые вы хотите, но обычно я бы рекомендовал придерживаться создания пользовательской текстовой системы в коде.