3

私はいくつかの問題を引き起こしている NSTextStorage のサブクラスを持っています。次の操作を行うたびにクラッシュします。

  1. 最初の行にテキストを入力します
  2. Return キーを押して次の行に移動します
  3. 少なくとも 2 文字を入力してください
  4. バックスペースを押す

私が得ているエラーはTerminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The index -4097 is invalid'

本当の問題は、エラーを自分のコードまでさかのぼって追跡できないことです。デバッグによって得られる最も遠いものは、 getssuper.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 &&
        (editedMask.rawValue & NSTextStorageEditActions.EditedCharacters.rawValue) == NSTextStorageEditActions.EditedCharacters.rawValue &&
        changeInLength > 0) {
        doSetAttributesForRange(editedRange)
    }
    print(backingStore)
    super.processEditing()
}
4

2 に答える 2

0

私はこの問題を抱えていましたが、次の方法で修正しました。

UITextViews Layout Manager のカスタム テキスト ストレージ サブクラスを設定した後、XIB ファイルで UITextView のスクロールを無効にし、プログラムで再度有効にします。

于 2019-06-15T06:31:26.457 に答える