删除字符后NSTextStorage子类崩溃

时间:2016-10-12 13:24:37

标签: ios nstextstorage

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

  1. 在第一行输入一些文字
  2. 点击返回以转到下一行
  3. 输入至少两个字符
  4. 点击退格
  5. 我得到的错误是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()
    }
    

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我遇到了这个问题,以下内容为我解决了。

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