使用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部分中的行数无效。”
答案 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动画