Сбой подкласса NSTextStorage при удалении символов

#ios #nstextstorage

#iOS #nstextstorage

Вопрос:

У меня есть подкласс NSTextStorage, который вызывает у меня некоторые проблемы. Я получаю сбой каждый раз, когда делаю следующее:

  1. Введите некоторый текст в первой строке
  2. Нажмите return, чтобы перейти к следующей строке
  3. Введите не менее двух символов
  4. Нажмите 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.