更新UITableView

时间:2016-11-01 10:45:15

标签: ios swift uitableview

删除行时,我遇到了崩溃。

// Updating my data model 
....
// apply the updates
self.tableView.beginUpdates()
self.tableView.deleteRows(at: indexPathsToDelete, with: .automatic)
self.tableView.endUpdates()

重现的步骤 - 添加行 - 删除行,特别是确保当前屏幕外有一些行(当删除成功时,它将在屏幕中显示) - 重复直到发生崩溃

它并不总是发生,所以我最好的猜测是它只会在它试图加载的单元格被回收时发生

这是在10.0模拟器中使用Xcode 8.0

  *** Assertion failure in -[UITableView _updateWithItems:updateSupport:],
 /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3599.6/UITableView.m:3149
 Missing cell for newly visible row 2
 (null)

cellForRowAt的代码

if isMultipe{
   let cell =  tableView.dequeueReusableCell(withIdentifier: DetailsTableViewCell.defaultIdentifier, for: indexPath) as! DetailsTableViewCell
return cell
    } else {
let cell =  tableView.dequeueReusableCell(withIdentifier: DetailsMultipleTableViewCell.defaultIdentifier, for: indexPath) as! DetailsMultipleTableViewCell
   return cell
}

此处报告的错误相同:https://forums.developer.apple.com/thread/49676

7 个答案:

答案 0 :(得分:7)

我遇到了同样的问题,我发现UITableView在部分标题高度可变时动画插入/更新/删除行有严重问题。只需将高度转换为某个常量并再次尝试。

这实际上意味着删除estimatedSectionHeaderHeight

答案 1 :(得分:1)

在我的情况下,当单元格使用自动布局来计算它的高度时,它会崩溃。因此,唯一有保障的解决方案是使用手动计算高度。 (实际上很伤心......)

答案 2 :(得分:1)

在我的情况下,我有这个问题只是为了将第一行插入空白部分,所以我试着像这样修复它:

self.array.append(item)
if self.array.count > 1 {
    self.tableView.beginUpdates()
    self.tableView.insertRows(at: indexPathes, with: .top)
    self.tableView.endUpdates()
} else {
    self.tableView.reloadSections([1], with: .fade)
}

答案 3 :(得分:1)

当我有不同大小的细胞时,这个问题发生在我身上。我的代码:

tableView.estimatedRowHeight = 150
tableView.rowHeight = UITableViewAutomaticDimension

在移动/插入/删除期间,应用程序因"Missing cell for newly visible row"消息而崩溃。所以我删除了这一行:

tableView.estimatedRowHeight = 150

并实现委托方法,其中每行返回单独的估计高度。

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {}

希望它会对某人有所帮助。

答案 4 :(得分:0)

删除tableView.dequeueReusableCell中的indexPath

if isMultipe{
   let cell =  tableView.dequeueReusableCell(withIdentifier: DetailsTableViewCell.defaultIdentifier) as! DetailsTableViewCell
return cell
    } else {
let cell =  tableView.dequeueReusableCell(withIdentifier: DetailsMultipleTableViewCell.defaultIdentifier) as! DetailsMultipleTableViewCell
   return cell
}

答案 5 :(得分:0)

我遇到了类似的问题。

emrekyv建议删除estimatedSectionHeaderHeight,但我有一个表有一个seaction,没有标题,没有页脚。

扩展他的想法并将estimatedRowHeight设置为0(=非自动)修复了问题。

所以规则是:

更新UITableView时不要估计任何高度。

答案 6 :(得分:0)

就我而言,这是由于我忘记在自定义子类中调用super.prepareForReuse()而发生的。

请参见https://developer.apple.com/documentation/uikit/uitableviewcell/1623223-prepareforreuse

  

如果重写此方法,则必须确保调用超类   实施。