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

时间:2013-03-25 17:23:27

标签: ios uiscrollview uitextview

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

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

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

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

任何人都可以告诉我发生了什么,以及我如何解决问题。

谢谢!

2 个答案:

答案 0 :(得分:0)

UITextField的自动滚动行为可能很烦人,有时难以利用。

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

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

答案 1 :(得分:0)

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