为了清晰起见,我有一个UIView Controller
顶视图,其中包含一个textfield
。我也有一个tableview
下面,每行包含1 textfield
。
问题:当我使用"didEndEditing"
任何文本字段时,这意味着顶视图中的一个和表视图中的一个,我想将此信息保存到核心数据并重新加载tableview
。
完美运行,除了!当我(在任意位置)选择一个文本字段时,输入一个值,然后从一个文本字段中选择一个值,然后选择另一个文本字段。 这会导致键盘卡死,并且永远不会消失。
我已经诊断出这是因为"DidEndEditing"
调用时由于重新加载了单元格,所以我对刚刚选择的文本字段(键盘处于打开状态)的引用丢失了。
有人遇到过吗?有没有人找到一种精巧的解决方案,可以tableview cell
在选择textfield
内部数据时将数据重新加载到某个位置?
编辑:我尝试将其移动reloadData()
到"DidBeginEditing"
文本字段的功能,并成功使选择指示符出现,但是再次键盘没有参考,即使我呼叫之后成为第一响应者tableView.relaodData()
我将完全避免重新加载表格视图,以免干扰文本的第一响应者状态。您可以(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) } }