在 UITableView 上 reloadData 后文本字段没有被选中
Posted
技术标签:
【中文标题】在 UITableView 上 reloadData 后文本字段没有被选中【英文标题】:Textfields don't get selected after reloadData on UITableView 【发布时间】:2013-10-06 12:59:20 【问题描述】:在我的 UITableView 中,每行包含 4 个文本字段。在用户结束编辑 UITableView 数据源中的几件事后,正在重新计算,所以我需要在编辑文本字段后重新加载 UITableView。但是由于 tableview 正在重新加载,当用户在编辑第一个文本字段时触摸另一个文本字段进行编辑时,第二个文本字段不会被选中。他必须再次触摸它才能对其进行编辑。
有没有办法避免这种行为?不幸的是,我确实需要使用 reloadData 而不是 reloadSections 或 reloadRows 方法。任何帮助将不胜感激,谢谢!
【问题讨论】:
为什么需要重新加载? 文本字段编辑完成后,还需要更新几个不同的部分。在我看来,这是一个更好的解决方案,因为几乎整个 tableview 都需要重新显示。即使我将 UITableViewRowAnimation 设置为 None,我也遇到了 reloadSections 方法的一些奇怪的动画问题 你能得到单元格并直接更新它们吗?您是添加行/部分还是更改行高? 在更新过程中可能会发生添加行,但不一定。行高是可变的,但在此过程中不可变。 因此您可以根据需要更新单元格并在任何新行中设置动画。 【参考方案1】:重新加载表格视图将退出文本字段甚至文本视图的第一响应者。如果您需要进行多项更改,您可以尝试这个技巧。
[[self tableView] beginUpdates]
[[self tableView] endUpdates]
【讨论】:
这会因为行数被改变而导致崩溃。我以前在使用这个解决方案时遇到了很多麻烦,所以我放弃了它。 我得看一些代码,但必须有更简洁的解决方案。【参考方案2】:尝试为每个字段分配一个gestureRecognizer
,或为所有字段分配相同的gestureRecognizer
。在必填字段中捕获touch
后,捕获tag
并将该字段设为firstResponder
。
【讨论】:
现在我正在尝试实现类似的解决方案,但只是延迟了一点重新加载,因此调用了 didBeginEditing,因此无需实际分配手势识别器。但是我对这个解决方案并不完全满意。希望会有一些更简单、更清洁的解决方案,但我想我必须坚持下去,除非我想到其他事情。 我似乎真的很接近完成这个,但是有一个小问题。当我在文本字段之间切换时,有一个短暂的时刻,键盘隐藏了 0.1 秒并再次出现。看起来不太好。 你在textFieldDidEndEditing
中做resignFirstResponder
吗?如果是,那可能是隐藏+显示键盘的原因
当我第一次注意到这个时,我正在寻找它,但不,我不使用它。【参考方案3】:
总结我收到的所有帮助和我自己的想法,如下:
-延迟重新加载 0.01 秒,以便调用 textFieldDidBeginEditing
-然后将文本字段的标签和单元格的索引路径保存到textFieldDidBeginEditing
中的变量中
-在tableview上调用reloadData
-在使用变量保存的文本字段上调用becomeFirstResponder
然而,这会导致键盘暂时隐藏,因为它在重新加载期间没有任何响应。为了解决这个问题,我在 tableview 的 superview 中创建了一个假文本字段,并将他分配为响应者,直到重新加载 tableview 以分配回用户选择的文本字段。
当然不是最干净的解决方案,但它确实有效。
【讨论】:
以上是关于在 UITableView 上 reloadData 后文本字段没有被选中的主要内容,如果未能解决你的问题,请参考以下文章
使用UITableView自动在UITableView上滚动UIImageView