代码改变世界

indexPathsForSelectedRows被reloadData破坏

2018-09-17 15:43  法子  阅读(1039)  评论(0编辑  收藏  举报

参考文章:https://blog.csdn.net/a906335708/article/details/79300521

通过设置

        tableView.allowsMultipleSelectionDuringEditing = true

或者实现协议

func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
        return UITableViewCell.EditingStyle(rawValue: UITableViewCell.EditingStyle.insert.rawValue | UITableViewCell.EditingStyle.delete.rawValue)!
    }

都可以由

        tableView.setEditing(true, animated: true)

或者有导航栏时添加左上角的编辑按钮,通过点击编辑按钮

        //返回和左边的按钮同时存在
//        navigationItem.leftItemsSupplementBackButton = true
        navigationItem.leftBarButtonItem = editButtonItem

进入编辑模式,来实现cell的多选,并且可以通过

tableView.indexPathsForSelectedRows

来获取选中的indexPath。

但是,

tableView.reloadData()

会破坏indexPathsForSelectedRows的值,使其重新为nil。

如果tableView进入编辑期间,(不知道的情况下)触发了reloadData,就会出现indexPathsForSelectedRows的值不对的情况。

如果编辑状态下不可避免要reloadData,可以建一个数组在下面两个协议中记录选中的data

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    ...
} func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    ... }

然后,在下面协议里根据数组判断,去设置是否是选中状态,

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    ... cell.setSelected(xxxxx, animated:
false) }