TextViewDidChangeSelection中的奇怪UItextView行为设置范围

时间:2013-08-20 16:31:25

标签: ios objective-c uitextview

我得到一个奇怪的行为,为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重置位置,而不是以编程方式执行,并且在那里工作正常。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我设法克服了这个问题。而不是:

hiddenTextView.selectedRange = _hiddenTextViewDefaultRange;

我用过:

dispatch_async(dispatch_get_main_queue(), ^{
            textView.selectedRange = hiddenTextViewDefaultRange;
        });

...执行命令async。它有效,但我不确定为什么它需要那样。