在 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自动在UITableView上滚动UIImageView

JSON 解析:在 UITableView 上显示数据

在 RootController 上调整 UITableView 的大小

如何在 UITableView 删除按钮上添加图像?

在 UIViewController 上使用 UITableView