Ios 正在请求caretRectForPosition:而NSTextStorage有未完成的更改
我最近遇到了一个错误:Ios 正在请求caretRectForPosition:而NSTextStorage有未完成的更改,ios,swift,ipad,uitextview,Ios,Swift,Ipad,Uitextview,我最近遇到了一个错误: requesting caretRectForPosition: while the NSTextStorage has oustanding changes {x, x} *“驱逐”是字面意思,不是我的打字错误 当我使用enumerateAttribute()方法遍历NSTextView子类的NSTextStorage并在文本视图中每次更改后操作文本视图中的NSTextAttachment时,会调用此函数 func manipulateText() { let
requesting caretRectForPosition: while the NSTextStorage has oustanding changes {x, x}
*“驱逐”是字面意思,不是我的打字错误
当我使用enumerateAttribute()
方法遍历NSTextView
子类的NSTextStorage
并在文本视图中每次更改后操作文本视图中的NSTextAttachment
时,会调用此函数
func manipulateText() {
let text = customTextView.textStorage
text.enumerateAttribute(NSAttachmentAttributeName, inRange: NSMakeRange(0, text.length), options: NSAttributedStringEnumerationOptions(rawValue: 0)) {
//
}
}
extension ThisViewController: UITextViewDelegate {
func textViewDidChange(textView: UITextView) {
manipulateText()
}
}
像这样的问题似乎是在线的,但我还没有找到任何这种情况,似乎只与iOS 9有关
只有在iPad上使用物理键盘时才会发生这种情况。如果在文本存储进行编辑时调用
caretRectForPosition
(或调用类似firstRectForRange
的任何方法),则会发生这种情况
我可以通过将某些内容推迟到在NSTextStorage中调用endEditing
并dispatch_async
到主队列执行我的工作之后,来阻止这些日志。由于异步,没有任何可见的UI闪烁或任何东西
必须有更好的方法来解决这个问题,但这是我所能想到的。在9.2中,无论是否使用物理键盘,我都会遇到这种情况。@SamSoffes您是否覆盖了任何与插入符号相关的方法?没有。不过我正在做一些复杂的事情。还没有花时间尝试简化来解决这个问题。最近有关于这个问题的更新吗?我收到了同样的明显错误消息,我有一个自定义的NSTextStorage,它可以与标准UITextView配合使用,但是当我将它与自定义UITextView子类一起使用时,它演示了这个问题。我重写了caretRectForPosition:并在错误发生之前发现editedMask==0和editedRange==(NSNotFound,0)。我如何找出导致此问题的原因?(我需要在生产环境中使用自定义UITextView类,但可以使用标准类进行测试)。我所有的beginEditing和endEditing呼叫都是成对的。任何想法都值得赞赏!谢谢@我不记得这个具体的问题,但我通常也会做类似的事情,所以也许这会有所帮助。当NSTextStorage中有我想要响应的编辑或其他内容时,我会将一个变量(如
needsUpdate
)设置为true。在processEditing
中,我调用super
,然后如果设置了该标志,我将做一些工作。也许试一下?昨晚就想出来了——更像是“拍额头”的时刻。问题是macOS遗留的代码行添加了第二个layoutmanager。这在某种程度上导致了iOS上的一个问题,并解释了为什么它在股票UITextView上工作正常。(是的,我自己也做了一些类似的过程编辑——到目前为止效果很好!)感谢您的回复!!!也解释了为什么我的诊断没有发现任何有用的东西——sttextstorage本身没有问题。