Jer*_*nd2 1 uitableview ios swift
为了清晰起见,我有一个UIView Controller顶视图,其中包含一个textfield。我也有一个tableview下面,每行包含1 textfield。
问题:当我使用"didEndEditing"任何文本字段时,这意味着顶视图中的一个和表视图中的一个,我想将此信息保存到核心数据并重新加载tableview。
完美运行,除了!当我(在任意位置)选择一个文本字段时,输入一个值,然后从一个文本字段中选择一个值,然后选择另一个文本字段。 这会导致键盘卡死,并且永远不会消失。
我已经诊断出这是因为"DidEndEditing"调用时由于重新加载了单元格,所以我对刚刚选择的文本字段(键盘处于打开状态)的引用丢失了。
有人遇到过吗?有没有人找到一种精巧的解决方案,可以tableview cell在选择textfield内部数据时将数据重新加载到某个位置?
编辑:我尝试将其移动reloadData()到"DidBeginEditing"文本字段的功能,并成功使选择指示符出现,但是再次键盘没有参考,即使我呼叫之后成为第一响应者tableView.relaodData()
我将完全避免重新加载表格视图,以免干扰文本的第一响应者状态。您可以(1)仅插入和删除更改的内容,或者(2)重新装饰需要更新的单元格。
因此,不用调用,而是myTableView.reloadData()找出需要添加或删除的索引路径并调用适当的方法。
myTableView.insertRows(at: newIndexPaths, with: .automatic)
myTableView.deleteRows(at: oldIndexPaths, with: .automatic)
Run Code Online (Sandbox Code Playgroud)
这就需要一种更加模块化的方法来使单元出队。而不是这样做:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
cell.data = dataArray[indexPath.row]
return cell
}
Run Code Online (Sandbox Code Playgroud)
做这个:
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]
}
Run Code Online (Sandbox Code Playgroud)
这样以后您就可以重新装修,即更新单元的内容和配置,而无需重新加载和干扰第一响应者状态:
for cell in myTableView.visibleCells {
if let indexPath = myTableView.indexPath(for: cell) {
decorate(cell: cell, at: indexPath)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2115 次 |
| 最近记录: |