Ios NSTextStorage子类在删除字符时崩溃

Ios NSTextStorage子类在删除字符时崩溃,ios,nstextstorage,Ios,Nstextstorage,我有一个NSTextStorage的子类,它给了我一些问题。每次我执行以下操作时都会遇到崩溃: 在第一行输入一些文本 点击回车键移动到下一行 请至少输入两个字符 点击退格 我收到的错误是由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“索引-4097无效” 真正的问题是,我无法将错误追溯到我自己的任何代码。通过调试,我能得到的最远结果是调用了processEditing覆盖中的super.processEditing。stacktrace也没有给我

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

  • 在第一行输入一些文本
  • 点击回车键移动到下一行
  • 请至少输入两个字符
  • 点击退格
  • 我收到的错误是
    由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因是:“索引-4097无效”

    真正的问题是,我无法将错误追溯到我自己的任何代码。通过调试,我能得到的最远结果是调用了
    processEditing
    覆盖中的
    super.processEditing
    。stacktrace也没有给我任何东西可以使用

    编辑:做了更多的测试,发现这只发生在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()
    }
    

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

    我有这个问题,下面的程序为我修复了它

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