繁体   English   中英

如何在编辑 tableview 单元格中的文本字段时重新加载所有 tableview 单元格 - iOS Swift

[英]How to reload all tableview cells, while editing a textfield in a tableview cell - iOS Swift

对于 Clarity,我有一个UIView Controller ,其顶视图包含一个textfield 我下面还有一个tableview ,每行包含 1 个textfield

问题:当我"didEndEditing"任何文本字段时,这意味着顶部视图中的文本字段和表视图中的文本字段,我想将此信息保存到核心数据并重新加载tableview

这完美地工作,除了! 当我选择一个文本字段(任何地方)时输入一个值,然后从一个文本字段中被选中,选择另一个文本字段。 这会导致键盘卡住并且永远不会消失。

我已经诊断出这是因为当"DidEndEditing"被调用时,由于单元格被重新加载,我失去了对我刚刚选择的文本字段的引用(谁的键盘已启动)。

有没有人遇到过这个? 有没有人找到一个优雅的解决方案来在选择其中的textfield时将数据重新加载到tableview cell

编辑:我尝试将reloadData()移动到"DidBeginEditing""DidBeginEditing"函数,并成功地让选择指示器出现,但键盘再次没有参考,即使我在tableView.relaodData()之后调用成为第一响应者tableView.relaodData()

我会完全避免重新加载表格视图,以免打扰文本的第一响应者状态。 您可以 (1) 仅插入和删除更改的内容或 (2) 重新装饰需要更新的单元格。

1.插入和删除

因此,与其调用myTableView.reloadData()myTableView.reloadData()找出需要添加或删除哪些索引路径并调用适当的方法。

myTableView.insertRows(at: newIndexPaths, with: .automatic)
myTableView.deleteRows(at: oldIndexPaths, with: .automatic)

2. 重新装修

这需要一种更加模块化的方法来处理如何使单元出列。 而不是这样做:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
    cell.data = dataArray[indexPath.row]
    return cell
}

做这个:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
    decorate(cell, at: indexPath)
    return cell
}

func decorate(_ cell: UITableViewCell, at indexPath: IndexPath) {
    cell.data = dataArray[indexPath.row]
}

这样以后您可以重新装饰,即更新单元格的内容和配置,而无需重新加载和干扰第一响应者状态:

for cell in myTableView.visibleCells {
    if let indexPath = myTableView.indexPath(for: cell) {
        decorate(cell: cell, at: indexPath)
    }
}

您是否尝试过在重新加载 tableview 之前存储 indexpath 并使用它来查找单元格并在重新加载后将其中的文本字段设置为第一响应者?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM