私はいくつかの問題を抱えているNSTextStorageのサブクラスを持っています。文字を削除するとNSTextStorageサブクラスがクラッシュする
が- が
- は、少なくとも2つの文字に
- ヒットバックスペースを入力します。次の行に移動するには、最初の行に
- ヒット復帰をいくつかのテキストを入力します。私は、次の操作を行うたびにクラッシュを取得しています
私は取得していますエラーは、本当の問題は、私はERRをトレースすることができないということですTerminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The index -4097 is invalid'
です自分のコードのいずれかに戻ることができます。私がデバッグすることによって得られる最も遠いものは、super.processEditing
の中で、processEditing
のオーバーライドが呼び出されるということです。 stacktraceは私にどちらかと一緒に働くことを何も与えていません。
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()
}