В настоящее время я пытаюсь создать экран, похожий на SMS, где пользователь может написать текст и отправить его другим пользователям. Все идет так, как ожидалось, пока я не попытаюсь очистить свое текстовое представление и не столкнусь с ошибкой. Я пытался найти способ обойти эту проблему, но я просто не могу найти достаточно документации в Интернете. Итак, вот оно, и, надеюсь, один из вас знает, как это исправить.
Реализация
Мой UITextView является подклассом реализации Питера Стейнбергера для iOS7, и я использую его с пользовательским подклассом NSTextStorage, как показано в objc.io «Знакомство с TextKit», и особенно с этим исходный код для выделения имен пользователей в сообщении.
В моем ViewController я настраиваю свое текстовое хранилище следующим образом:
self.textStorage = [[[MyCustomTextStorage alloc] init] autorelease];
[self.textStorage addLayoutManager:self.textView.layoutManager];
А затем в моем методе делегата TextView:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
Я сохраняю ввод в своем пользовательском TextStorage:
[self.textStorage.string stringByReplacingCharactersInRange:range withString:text];
Авария
Я могу получить свой текст через self.textStorage.string
, а затем очистить свое текстовое представление, заменив символы в диапазоне входной строки. Это работает довольно хорошо, но когда я снова пытаюсь установить TextView в качестве первого ответчика, приложение падает.
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSCFString _getBlockStart:end:contentsEnd:forRange:stopAtLineSeparators:]: Range {5, 0} out of bounds; string length 0'
Упомянутый диапазон - это диапазон моей ранее очищенной строки, поэтому похоже, что я могу очистить дисплей, но мой TextStorage/TextView сохраняет ссылку на первый отредактированный диапазон/строку.
Любая идея о том, что может быть причиной этого сбоя и как его решить? Спасибо за внимание; на данный момент любая помощь приветствуется, поэтому, пожалуйста, не стесняйтесь публиковать, если у вас есть совет. :)