使用tableView.beginUpdates()执行didSelectRowAt时发生错误tableView.endUpdates()

时间:2019-06-26 11:10:41

标签: ios swift uitableview

使用Folding Cell框架以及PaginatedTableView框架,该框架似乎可以处理20-40行。当我点击单元格时,它可以毫无问题地打开/关闭,但是当向下滚动数据时->点击单元格会抛出以下错误 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:无效的更新:部分0中的行数无效。更新(80)后现有部分中包含的行数必须等于该部分中包含的行数在更新(60)之前,加上或减去从该部分插入或删除的行数(已插入0,已删除0),以及加上或减去移入或移出该部分的行数(移入0,移出0 )。

从api加载数据时,我正在设置cellheight的值

self.cellHeights = (0..<self.myNewsList.count).map{ _ in C.CellHeight.close }
 var cellHeights: [CGFloat] = []
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as? TableViewCell else {
        fatalError("The dequeued cell is not an instance of TableViewCell.")
    }
    let durations: [TimeInterval] = [0.26, 0.2, 0.2]
    cell.durationsForExpandedState = durations
    cell.durationsForCollapsedState = durations
    return cell
}
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}`
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    guard case let cell as FoldingCell = tableView.cellForRow(at: indexPath) else {return}
    if cell.isAnimating() { 
        return
    }
    var duration = 0.0
    let cellIsCollapsed = self.cellHeights[indexPath.row] == C.CellHeight.close
    if cellIsCollapsed {
        self.cellHeights[indexPath.row] = C.CellHeight.open
        cell.unfold(true, animated: true, completion: nil)
        duration = 0.5
    } else {
        self.cellHeights[indexPath.row] = C.CellHeight.close
        cell.unfold(false, animated: true, completion: nil)
        duration = 0.8
    }
    UIView.animate(withDuration: duration, delay: 5, options: .curveEaseOut, animations: { () -> Void in
        tableView.beginUpdates()
        tableView.endUpdates()
         if cell.frame.maxY > tableView.frame.maxY {
            tableView.scrollToRow(at: indexPath, at: UITableView.ScrollPosition.bottom, animated: true)
        }
    }, completion: nil)

}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    guard case let cell as FoldingCell = cell else {
        return
    }
    cell.backgroundColor = .clear
    if cellHeights[indexPath.row] == C.CellHeight.close{
        cell.unfold(false, animated: false, completion: nil)
    } else {
        cell.unfold(true, animated: false, completion: nil)
    }
}

我认为在点击didSelectRowAt

tableView.beginUpdates()

tableView.endUpdates()

  

获取错误“无效更新:第0部分中的行数无效。”

2 个答案:

答案 0 :(得分:1)

docs说:

  

如果要后续插入,删除和删除,请调用此方法   选择操作(例如,cellForRow(at :)和   indexPathsForVisibleRows)同时进行动画处理。你也可以   使用此方法,然后使用endUpdates()方法为   在不重新加载单元格的情况下更改行高。这一组   方法必须以调用endUpdates()作为结束。这些方法   对可以嵌套。如果您不进行插入,删除和   该块内的选择调用,表属性(例如行数)   可能会失效。

由于您在beginUpdates()endUpdates()之间不进行任何操作,因此表属性(例如行数)可能变得无效。这可能是您的问题。

答案 1 :(得分:0)

在didSelectRowAt的底部添加以下代码后,它起作用了

let section = IndexSet.init(integer: indexPath.section) tableView.reloadSections(section, with: .none)

在不崩溃的情况下效果很好,但动画无法按照FoldingCell动画