2016-10-12 2 views
3

私はいくつかの問題を抱えているNSTextStorageのサブクラスを持っています。文字を削除するとNSTextStorageサブクラスがクラッシュする

  1. は、少なくとも2つの文字に
  2. ヒットバックスペースを入力します。次の行に移動するには、最初の行に
  3. ヒット復帰をいくつかのテキストを入力します。私は、次の操作を行うたびにクラッシュを取得しています

私は取得していますエラーは、本当の問題は、私は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() 
} 

答えて

0

なぜ、クラッシュが起こっているのかまだ分かりませんが、私は回避策を見つけることができました。ストーリーボードからTextViewを削除し、TextContainerとNSLayoutManagerとともにプログラムで作成したため、クラッシュが発生しなくなったため、レイアウトの制約やリッチテキストエディタのTextViewのサイズに関係しているようです。

関連する問題