2013-12-01 5 views
7

Моя цель - использовать TextKit для наложения курсора, установки размера текста и т. Д. Определенных слов.Недопустимый индекс глифа при установке viewMontroller layoutManager для подкласса NSTextStorage

Чтобы начать, я пытаюсь выделить символ в текстовой строке. Будучи новичком в TextKit (и правдиво для программирования в целом), я следую теме подсветки синтаксиса проблемы obc.io №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 для моего подкласса подпрограммы и NSTextStorage, here и here, соответственно.

ответ

9

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

В общем, я обнаружил, что TextKit не играет хорошо при смешивании nib/xib/раскадровки, созданных UITextViews с пользовательскими подклассами объектов TextKit. Вы можете обойти некоторые из них, переопределив на UITextView и построив текстовую систему, используя классы, которые вы хотите, но обычно я рекомендую придерживаться встроенной текстовой системы в коде.

+1

Мне удалось получить эту работу без необходимости переопределять awakeAfterUsingCoder. Удаление layoutManager перед добавлением инициализации подкласса textStorage и добавление layoutManager readerTextView решило мою проблему; текстовое представление отображает текст на экране, используя мой собственный текстовый файл. – jefffreyallen

+1

Вау, 'removeLayoutManager:' сделал трюк для меня. Спасибо огромное! – Stream