对于Clarity,我的UIView Controller
顶视图包含textfield
。我的下面还有tableview
,每行包含1 textfield
。
问题:当我"didEndEditing"
任何文本字段时,这意味着顶视图中的那个和表视图中的那个我想将此信息保存到核心数据并重新加载tableview
。
这完美无缺,除外!当我选择一个文本字段(任何地方)输入一个值,然后从一个文本字段中选择,选择另一个文本字段。这会导致键盘卡住,永远不会消失。
我已经诊断出这是因为当调用"DidEndEditing"
时,由于重新加载了单元格,我会丢失对刚刚选择的文本字段(键盘已启动)的引用。
之前有没有遇到过这个?有没有人找到一个优雅的解决方案,将数据重新加载到tableview cell
,同时在其中选择textfield
?
编辑:我已尝试将reloadData()
移动到文本字段的"DidBeginEditing"
功能,并成功显示选择指示符,但键盘也没有引用,即使我调用成为第一个tableView.relaodData()
答案 0 :(得分:4)
我会避免重新加载表格视图,这样就不会打扰文本的第一响应者状态。您可以(1)仅插入和删除已更改的内容,或(2)重新调整需要更新的单元格。
因此,不要调用myTableView.reloadData()
,而是找出需要添加或删除哪些索引路径并调用适当的方法。
myTableView.insertRows(at: newIndexPaths, with: .automatic)
myTableView.deleteRows(at: oldIndexPaths, with: .automatic)
这需要一种更模块化的方法来确定如何使单元格出列。而不是这样做:
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)
}
}
答案 1 :(得分:0)
您是否尝试在重新加载tableview之前存储索引路径并使用它来查找您的单元格并在重新加载后将其中的文本字段设置为第一响应者?