3

我有一个 NSTextStorage 的子类,这给了我一些问题。每次执行以下操作时,我都会崩溃:

  1. 在第一行输入一些文本
  2. 按回车键移动到下一行
  3. 输入至少两个字符
  4. 按退格键

我得到的错误是Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The index -4097 is invalid'

真正的问题是我无法将错误追溯到我自己的任何代码。我可以通过调试得到的最远的结果是在调用super.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

好吧,我设法找到了一些解决方法,尽管我仍然不知道为什么会发生崩溃。它似乎与布局约束或富文本编辑器的 TextView 的大小有关,因为在我从情节提要中删除 TextView 并以编程方式创建它(连同 TextContainer 和 NSLayoutManager)后,不再发生崩溃。

于 2016-10-18T06:41:59.990 回答
0

我遇到了这个问题,下面为我解决了这个问题。

在为 UITextViews 布局管理器设置自定义文本存储子类后,禁用 XIB 文件中 UITextView 的滚动,然后以编程方式重新启用它。

于 2019-06-15T06:31:26.457 回答