当有多行时,“手动”处理 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】:UITextField
s 的自动滚动行为有时很烦人且难以驾驭。
您是否需要用户手动编辑文本?如果没有,请使用多行 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?