我为应用程序中使用的UITextView
实现了一个简单的 drfat存储。一切正常,但是当我检索这个草稿时,将其分配给UITextView
并设置selectedRange
(还有一些存储的值)我得到这个奇怪的警告:
requesting caretRectForPosition: with a position beyond the NSTextStorage (4)
从我注意到的事情......这只发生在短于4个字符的字符串上(这可能会给出一些线索,因为4也出现在警告信息中)。
实际的分配代码可能会有所帮助,所以这里是:
self.textView.text = savedDraft.text;
self.textView.selectedRange = NSMakeRange(savedDraft.cursorPosition, 0);
你知道什么可以产生这种警告吗?我发现here这可能是由于UITextView
的Swift实施造成的,但我们'纯粹的Objective-C。
更新
当我保存时,我会将此location
保存为NSUInteger
,我会从UITextView
这样保存:
self.textView.selectedRange.location
因此,如果您考虑一个简单的“Hi”消息(两个字符),我会得到这种日志形式的保存和检索方法:
Get draft position: 0
Saving draft position: 2
Get draft position: 2
答案 0 :(得分:0)
看起来UIKeyboardWillShowNotification
在这里起着重要的作用,当viewDidLoad
中发生的每一次事件都会产生冲突。
键盘显示也会影响插入位置,当我手动更改self.textView.selectedRange
时,我执行得太快,因此它与此键盘通知冲突。
对我来说,解决方案就是简单地将这个selectedRange
的东西放在块中,并且有一些非常小的延迟:
@weakify(self)
[JDLDispatchUtils asyncOnMainAfter:0.01 block:^{
@strongify(self)
self.textView.text = savedDraft.text;
self.textView.selectedRange = NSMakeRange(savedDraft.cursorPosition, 0);
}];