当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在编辑表格视图单元格中的文本字段时重新加载所有表格视图单元格-iOSSwift》经验,为你挑选了1个好方法。

为了清晰起见,我有一个UIView Controller顶视图,其中包含一个textfield。我也有一个tableview下面,每行包含1 textfield

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

完美运行,除了!当我(在任意位置)选择一个文本字段时,输入一个值,然后从一个文本字段中选择一个值,然后选择另一个文本字段。 这会导致键盘卡死,并且永远不会消失。

我已经诊断出这是因为"DidEndEditing"调用时由于重新加载了单元格,所以我对刚刚选择的文本字段(键盘处于打开状态)的引用丢失了。

有人遇到过吗?有没有人找到一种精巧的解决方案,可以tableview cell在选择textfield内部数据时将数据重新加载到某个位置?

编辑:我尝试将其移动reloadData()"DidBeginEditing"文本字段的功能,并成功使选择指示符出现,但是再次键盘没有参考,即使我呼叫之后成为第一响应者tableView.relaodData()



1> Patrick Lync..:

我将完全避免重新加载表格视图,以免干扰文本的第一响应者状态。您可以(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)
    }
}

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有