设置UITextView的光标位置会生成警告

时间:2016-09-28 08:17:53

标签: ios objective-c uikit uitextview nsrange

我为应用程序中使用的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

1 个答案:

答案 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);
}];