强制 UITextView 光标到视图顶部

Posted

技术标签:

【中文标题】强制 UITextView 光标到视图顶部【英文标题】:Force UITextView cursor to the top of the view 【发布时间】:2015-03-27 20:54:33 【问题描述】:

我有一个 UITableView,它包含一系列文本输入字段,可以是 UITextField 或 UITextView 控件。选择文本输入字段时,键盘的“下一个”按钮用于循环字段。这一切都正常工作,除了一件事。当 UITextView(多行)通过调用 becomeFirstResponder 获得焦点时,光标位于视图的第二行,而不是第一行。这似乎是解决该问题的最常见建议,但在我的情况下不起作用。有什么建议么?谢谢!

-(void)textViewDidBeginEditing:(UITextView *)textView

     [textView setSelectedRange:NSMakeRange(0, 0)];

也试过这个没有成功:

textView.selectedTextRange = [textView textRangeFromPosition:textView.beginningOfDocument toPosition:textView.beginningOfDocument];

【问题讨论】:

文本视图的代理是否已分配? 是的。这行代码被执行了 【参考方案1】:

似乎在调用textViewDidBeginEditing 后光标重新定位;所以你移动它,它就会被移回。您可以通过使用dispatch_async 调用setSelectedRange 来解决此问题:

-(void)textViewDidBeginEditing:(UITextView *)textView

    dispatch_async(dispatch_get_main_queue(), ^
        textView.selectedRange = NSMakeRange(0, 0);
    );;

为未来的用户更新您的修复,因为似乎另一个选项也可以解决我提到的问题,即performSelectorOnMainThread 并调用setCursor 来移动光标。

[self performSelectorOnMainThread:@selector(setCursor) withObject:nil waitUntilDone:NO];

【讨论】:

您的回答确实促使我尝试以下方法,这确实有效:[self performSelectorOnMainThread:@selector(setCursor) withObject:nil waitUntilDone:NO]; 太棒了,所以看起来原因是正确的,但有多种选择可以根据情况尝试解决它。感谢您的更新,因为它将帮助未来的用户。添加到我的答案中。

以上是关于强制 UITextView 光标到视图顶部的主要内容,如果未能解决你的问题,请参考以下文章

UITextView如何将光标保持在键盘上方

UITextview 光标移动到行尾

从UITextView创建PDF

如何让 UIScrollView 滚动到 UITextView 的光标位置?

iOS:滚动视图到文本视图中的当前光标位置

可变高度 UITextView