2016-10-12 3 views
3

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

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

ответ

0

Ну, мне удалось найти что-то обходное решение, хотя я до сих пор не знаю, почему происходит сбой. Кажется, что это связано с ограничениями макета или размером текстового редактора моего текстового редактора, поскольку после того, как я удалил TextView из раскадровки и создал его (вместе с TextContainer и NSLayoutManager) программно, авария больше не происходила.

Смежные вопросы