删除行后,表视图具有旧索引Swift

时间:2019-07-16 10:59:29

标签: ios swift

我具有表视图,该表视图使用以下命令删除某些行:

func deleteRows(_ indecies: [Int]) {
    guard !indecies.isEmpty else { return }
    let indexPathesToDelete: [IndexPath] = indecies.map{ IndexPath(row: $0, section: 0)}
    let previousIndex = IndexPath(row: indecies.first! - 1, section: 0)
    tableView.deleteRows(at: indexPathesToDelete, with: .none)
    tableView.reloadRows(at: [previousIndex], with: .none)
  }

cellForRow中,我的单元格具有“ tap”闭包,如下所示:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard indexPath.row < presenter.fields.count else { return EmptyCell() }
    let field = presenter.fields[indexPath.row]
    switch field.cellType {
    case .simple:
      guard let model = field as? SimpleTextItem else { return EmptyCell() }
      let cell = SimpleTextCell()
      cell.setup(label: LabelSL.regularSolidGray(), text: model.text, color: Theme.Color.bleakGray)
      return cell
    case .organization:
      guard let model = field as? OrganizationFilterItem else { return EmptyCell() }
      let cell = OrganizationFilterCell()
      cell.setup(titleText: model.title,
                 holdingNumberText: model.holdingNumberText,
                 isChosed: model.isChosed,
                 isHolding: model.isHolding,
                 isChild: model.isChild,
                 bottomLineVisible: model.shouldDrawBottomLine)

      cell.toggleControlTapped = {[weak self] in
        self?.presenter.tappedItem(indexPath.row)
      }
      return cell
    }
  }

何时

cell.toggleControlTapped = {[weak self] in
            self?.presenter.tappedItem(indexPath.row)
          }

在删除行后点击,索引通过是错误的(旧的)。例如,我有10行,我删除了2-3-4-5行,然后我点击了2行(删除前为6行)。该方法传递的是“ 6”而不是“ 2”。

问题实际上是通过在tableView.reloadData(函数中添加deleteRows)来解决的,但是,您可能会假设动画顺利消失了,而且看起来很粗糙而且不好看。为什么表仍然通过旧索引以及如何解决?

2 个答案:

答案 0 :(得分:1)

一个很简单的解决方案是在闭包中传递单元格,以获取实际索引路径

好好玩

var toggleControlTapped : ((UITableViewCell) -> Void)?

称呼

toggleControlTapped?(self)

处理

cell.toggleControlTapped = {[weak self] cell in
    guard let actualIndexPath = self?.tableView.indexPath(for: cell) else { return }
    self?.presenter.tappedItem(actualIndexPath.row)
}

旁注:重复使用单元格。使用默认的初始化程序创建单元格是非常糟糕的做法。

答案 1 :(得分:-2)

请确保也更新您的数据,索引从表视图的numberofrows函数中出现