使用Folding Cell框架和PaginatedTableView框架,它似乎可以在20-40行中正常工作。当我点击单元格时,它会毫无问题地打开/关闭,但是当向下滚动数据时-->点击单元格会抛出以下错误
由于未捕获异常“NSInternalInconsistencyException”而终止应用程序,原因:无效更新:第0节中的行数无效。更新之后(80)中包含的现有区段中的行数必须等于更新之前(60)中包含的那一行的行数,加上或减去从该区段插入或删除的行数(插入0,删除0),加上或减去进入或退出该区段的行数(0移入),0已移出)。
我正在设置cellheight的值,同时从api加载数据

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节中的行数无效。”

最佳答案

docs说:
如果希望后续插入、删除和
选择操作(例如,cellForRow(at:)和
indexPathsForVisibleRows)同时设置动画。你也可以
使用此方法,然后使用endUpdates()方法设置
在不重新加载单元格的情况下更改行高。这群人
方法必须以调用endUpdates()结束。这些方法
可以嵌套对。如果不进行插入、删除和
此块中的选择调用、表属性(如行计数)
可能会变得无效。
由于在beginUpdates()endUpdates()之间不执行任何操作,表属性(如行计数)可能会变得无效。这可能是你的问题。

关于ios - 使用tableView.beginUpdates()执行didSelectRowAt时发生错误tableView.endUpdates(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56771477/

10-09 01:05