У меня есть подкласс NSTextStorage, который дает мне некоторые проблемы. Я получаю сбой каждый раз, когда я делаю следующее:При сборе подкласса NSTextStorage при удалении символов
- Введите текст на первой линии
- возвращение Хит, чтобы перейти к следующей строке
- Введите не менее двух символов
- Hit забой
ошибка я получаю Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The index -4097 is invalid'
реальная проблема заключается в том, что я не могу проследить ERR или вернуться к любому из моих собственных кодов. Самое дальнее, что я могу получить отладки, - это то, что вызываются super.processEditing
внутри переопределения processEditing
. Стектка не дает мне ничего для работы.
EDIT: Проделали еще несколько тестов и выяснили, что это происходит только на 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 &&
(editedMask.rawValue & NSTextStorageEditActions.EditedCharacters.rawValue) == NSTextStorageEditActions.EditedCharacters.rawValue &&
changeInLength > 0) {
doSetAttributesForRange(editedRange)
}
print(backingStore)
super.processEditing()
}