NSTextStorage 子类在删除字符时崩溃
NSTextStorage subclass crash upon removing characters
我有一个 NSTextStorage 的子类,它给我带来了一些问题。每次执行以下操作时我都会崩溃:
- 在第一行输入一些文字
- 点击return移动到下一行
- 至少输入两个字符
- 按退格键
我得到的错误是 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()
}
嗯,虽然我仍然不知道为什么会发生崩溃,但我设法找到了一些解决方法。它似乎与布局约束或我的富文本编辑器的 TextView 的大小有关,因为在我从情节提要中删除 TextView 并以编程方式创建它(连同 TextContainer 和 NSLayoutManager)后,崩溃不再发生。
我遇到了这个问题,下面为我解决了这个问题。
在您的 XIB 文件中禁用 UITextView 的滚动,然后在您为 UITextViews 布局管理器设置自定义文本存储子类后以编程方式re-enabled它。
我有一个 NSTextStorage 的子类,它给我带来了一些问题。每次执行以下操作时我都会崩溃:
- 在第一行输入一些文字
- 点击return移动到下一行
- 至少输入两个字符
- 按退格键
我得到的错误是 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()
}
嗯,虽然我仍然不知道为什么会发生崩溃,但我设法找到了一些解决方法。它似乎与布局约束或我的富文本编辑器的 TextView 的大小有关,因为在我从情节提要中删除 TextView 并以编程方式创建它(连同 TextContainer 和 NSLayoutManager)后,崩溃不再发生。
我遇到了这个问题,下面为我解决了这个问题。
在您的 XIB 文件中禁用 UITextView 的滚动,然后在您为 UITextViews 布局管理器设置自定义文本存储子类后以编程方式re-enabled它。