textViewDidChangeSelection

textViewDidChangeSelection

我在textViewDidChangeSelection委托中为textView设置selectedRange属性时遇到奇怪的行为。

我在viewDidLoad中的代码是:

hiddenTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
//[hiddenTextView setHidden:YES];
_hiddenTextViewText=@"ulrd";
hiddenTextView.text = _hiddenTextViewText;
hiddenTextView.delegate = self;
_hiddenTextViewDefaultRange = NSMakeRange(2,0);
hiddenTextView.selectedRange = _hiddenTextViewDefaultRange;   //horizontal and vertical center of the textview
[self.view addSubview:hiddenTextView];

[hiddenTextView becomeFirstResponder];
if (_keyboardShown)
    [hiddenTextView resignFirstResponder];

我将textViewDidChangeSelection定义如下:
- (void)textViewDidChangeSelection:(UITextView *)textView {

    NSLog(@"%lu",(unsigned long)textView.selectedRange.location);


    if (textView.selectedRange.location != _hiddenTextViewDefaultRange.location)
    {
        hiddenTextView.selectedRange = _hiddenTextViewDefaultRange;
    }

}

我设置了一个4个字符的文本,并将选择索引放在位置2(中间)。结果是,如果我按模拟器中的键盘上的向上箭头,则NSLog输出0(文本的开始),然后输出2(重置位置),这是正确的。如果我再按一次,它会执行相同的操作,因此仍然正确。问题是,如果我按了x次,则必须等分几次才能到达文本结尾(位置4)。
我尝试使用UIButton重置位置,而不是通过编程方式进行重置,因此效果很好。有任何想法吗?

最佳答案

我设法克服了这个问题。代替:

hiddenTextView.selectedRange = _hiddenTextViewDefaultRange;

我用了:
dispatch_async(dispatch_get_main_queue(), ^{
            textView.selectedRange = hiddenTextViewDefaultRange;
        });

...执行命令异步。它起作用了,但是我不确定为什么需要这样。

10-05 18:31