#ios #nstextstorage
#iOS #nstextstorage
Вопрос:
У меня есть подкласс NSTextStorage, который вызывает у меня некоторые проблемы. Я получаю сбой каждый раз, когда делаю следующее:
- Введите некоторый текст в первой строке
- Нажмите return, чтобы перейти к следующей строке
- Введите не менее двух символов
- Нажмите backspace
Ошибка, которую я получаю, Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The index -4097 is invalid'
Реальная проблема в том, что я не могу отследить ошибку до любого из моих собственных кодов. Самое большее, что я могу получить при отладке, это то, что super.processEditing
внутри переопределения processEditing
вызывается. Трассировка стека также не дает мне ничего для работы.
РЕДАКТИРОВАТЬ: провел еще несколько тестов и обнаружил, что это происходит только на iOS 9 и новее. Все, что находится на 8 или ниже, не падает.
override func attributesAtIndex(location: Int, effectiveRange range: NSRangePointer) -> [String : AnyObject] {
return backingStore.attributesAtIndex(location, effectiveRange: range)
}
override func replaceCharactersInRange(range: NSRange, withString str: String) {
beginEditing()
backingStore.replaceCharactersInRange(range, withString: str)
edited([.EditedCharacters, .EditedAttributes], range: range, changeInLength: (str as NSString).length - range.length)
endEditing()
}
override func setAttributes(attrs: [String : AnyObject]?, range: NSRange) {
beginEditing()
backingStore.setAttributes(attrs, range: range)
edited(.EditedAttributes, range: range, changeInLength: 0)
endEditing()
}
override func setAttributedString(attrString: NSAttributedString) {
programmaticChange = true
super.setAttributedString(attrString)
programmaticChange = false
}
override func processEditing() {
if (!programmaticChange amp;amp;
(editedMask.rawValue amp; NSTextStorageEditActions.EditedCharacters.rawValue) == NSTextStorageEditActions.EditedCharacters.rawValue amp;amp;
changeInLength > 0) {
doSetAttributesForRange(editedRange)
}
print(backingStore)
super.processEditing()
}
Ответ №1:
Что ж, мне удалось найти что-то вроде обходного пути, хотя я до сих пор понятия не имею, почему происходит сбой. Похоже, это связано либо с ограничениями макета, либо с размером TextView моего редактора форматированного текста, потому что после того, как я удалил TextView из раскадровки и создал его (вместе с textContainer и NSLayoutManager) программно, сбой больше не происходил.
Ответ №2:
У меня была эта проблема, и следующее исправило ее для меня.
Отключите прокрутку для UITextView в вашем XIB-файле, а затем программно повторно включите его после установки пользовательского подкласса текстового хранилища для UITextViews Layout Manager.