如何更新UITableView,以便单元格中的UITextField不会失去焦点

时间:2015-11-13 21:12:22

标签: ios swift uitableview

设置:该表有1个自定义单元格。此单元格有1个文本框。在每个文本框中输入一个数字。 tableView有5行(这个单元格)。如果我在任何一个单元格中更改了一个数字,那么所有单元格都需要更新,我只需调用tableView.reloadData()。文本框中的更改由editingDidEnd事件处理。

问题:我单击任何textFields并更改数字。然后,我单击另一个textField来更改其值。调用第一个editingDidEnd,重新计算所有值,并调用tableView.reloadData。现在,由于重新加载了表格,因此错过了第二个textField的点击。

我无法直接更新单元格,因为它们是自定义单元格,并且在该类中更改了值。我无法更新自定义单元格类中的所有单元格。

一个难以解决的问题,特别针对非母语英语人士。如果你理解了这个问题,那么任何指针都会受到赞赏:)。

使用Xcode 7.1和Swift。谢谢。

2 个答案:

答案 0 :(得分:1)

当您致电reloadData时,所有单元格都会从tableview中删除并重新添加。由于它已被删除,因此它不再是responder chain,意味着其文本字段不能成为第一个响应者(已选择)。

有两种选择可行。

跟踪所选行,调用reloadData,然后在文本字段中调用becomeFirstResponder以获取正确的行。

不调用重新加载数据,只更新文本字段中的值。此选项更多取决于您应用的条纹。

答案 1 :(得分:1)

这可能非常简单,理想情况下,您可以存储要聚焦的字段的值以及相关单元格的索引路径(例如重新加载后重新生成编辑字段时?)< / p>

此代码应该有所帮助:

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath == self.editingIndexPath)
    {
        [self.editingTextField becomeFirstResponder];
    }
}