当有多行时,“手动”处理 UITextView 的文本和光标位置中断

Posted

技术标签:

【中文标题】当有多行时,“手动”处理 UITextView 的文本和光标位置中断【英文标题】:"Manually" handling text and cursor position of UITextView breaks when there are multiple lines 【发布时间】:2013-03-25 17:23:26 【问题描述】:

我有一个狭窄的 UITextView(大约 1 行高),我只以编程方式向其中添加文本,在单击按钮时设置它的 text 属性。我还手动处理光标位置,在文本更改时设置selectedRange。只要我只有一行文字,一切都很好。

当我有两行或多行文本并尝试在第一行插入文本时,文本已正确插入并且光标位置仍在正确位置,但 UITextView 滚动到底部。然后,当我在顶部添加另一段文本时,它会向上滚动到“正确”位置。然后,这种模式会在除最后一行之外的每一行重复输入,使 UITextView 在每按下一个按钮时向上和向下滚动。

我还尝试在设置新文本后调用 UITextView scrollRangeToVisible: 将 selectedRange 属性作为参数传递。那也没用。

我在设置text 后延迟 0.5 秒后终于尝试设置selectedRange。然后它可以正常工作,但只有在 UITextView 首先向下滚动到底部 0.5 秒之后。这似乎表明 UITextView 的 setText 方法在某种程度上是异步的,并且在我已经设置 selectedRange 或调用 scrollRangeToVisible 后完成,并将 UITextView 重新调整到它认为是所需的。

谁能告诉我发生了什么,以及如何解决这个问题。

谢谢!

【问题讨论】:

【参考方案1】:

UITextFields 的自动滚动行为有时很烦人且难以驾驭。

您是否需要用户手动编辑文本?如果没有,请使用多行 UILabel

如果是,也使用多行UILabel,并在用户点击后即时将其与UITextView 交换。改回didEndEditing。这种技术在表格视图中对我很有效。

【讨论】:

感谢您的回答。但我不是在问 UITextField,但我猜你的意思是 UITextView,因为文本字段不会滚动很多。我仍然想要 UITextView 的插入符号和选择处理(当用户将手指拖到 textview 上时),所以我不想使用标签。我的 TextView 基本上一直都是第一响应者,所以我不会得到任何 didEndEditing。我想我会尝试通过实现 UITextInput 协议来构建自己的文本输入视图。【参考方案2】:

我解决了这个问题! 在开始创建自定义输入视图的迷宫时,我开始实现UITextInput,我发现UITextInput 协议声明了许多有趣的方法。令人敬畏的是UITextView 实现了该协议。因此,即使它不在直接的UITextView API 参考中,您也可以在您的UITextView 上调用所有UITextInput 方法。例如insertText:(来自UIKeyInput 协议)和replaceRange:withText:。他们使以编程方式使用UITextView 变得更加灵活。希望这也可以帮助其他人!

【讨论】:

以上是关于当有多行时,“手动”处理 UITextView 的文本和光标位置中断的主要内容,如果未能解决你的问题,请参考以下文章

python 当有很多(通常是多行)关键字参数都需要设置为类属性时,使用usefule

UIAlertController 内的多行可编辑文本 UITextview?

UIAlertController中的多行可编辑文本UITextview?

使用故事板、自动布局和 Swift 的多行 UILabel 和 UITextView

Swift - 多行文本输入框(UITextView)

UIScrollView 选择中的多行 UITextView 不起作用