为清楚起见,我有一个 UIView Controller
,其顶 View 包含一个 textfield
。我还有一个 tableview
下面的每一行都包含 1 个 textfield
。
问题:当我 "didEndEditing"
任何文本字段时,这意味着顶部 View 中的文本字段和 tableview 中的文本字段我想将此信息保存到核心数据并重新加载 表格 View
。
这非常有效,除了!当我选择一个文本字段(任何地方)时输入一个值,然后从一个文本字段中选择,选择另一个文本字段。这会导致键盘卡住,永远不会消失。
我已经诊断出这是因为当 "DidEndEditing"
被调用时,由于正在重新加载单元格,我失去了对我刚刚选择的文本字段(谁的键盘打开)的引用。
有没有人遇到过这个?有没有人找到一个优雅的解决方案来将数据重新加载到 tableview 单元格
,同时选择其中的 textfield
?
编辑:我尝试将 reloadData()
移动到文本字段的 "DidBeginEditing"
函数,并成功让选择指示器出现,但键盘再次出现没有引用,即使我在 tableView.relaodData()
最佳答案
我会完全避免重新加载表格 View ,这样您就不会打扰文本的第一响应者状态。您可以 (1) 仅插入和删除更改的内容,或者 (2) 重新装饰需要更新的单元格。
1。插入和删除
因此,与其调用 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)
}
}
关于ios - 如何在编辑表格 View 单元格中的文本字段时重新加载所有表格 View 单元格 - iOS Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41613420/