Swift中UITableView删除行崩溃求助:Invalid update错误
解决UITableView删除行崩溃问题
错误原因分析
你遇到的Invalid update: invalid number of rows in section 0错误,核心是数据源的行数变化和TableView的更新操作不匹配:更新前section 0有1行,你执行了删除1行的操作,但更新后TableView检测到数据源仍有1行,两者数量冲突导致崩溃。你怀疑的self.event.name.removeFirst()确实是问题所在。
修复步骤
删除对应位置的数据源元素
不要固定调用removeFirst()删除第一个元素,而是根据用户点击的行的indexPath.row删除数据源中对应位置的元素:func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { // 先更新数据源:删除点击行对应的数据 self.event.name.remove(at: indexPath.row) // 再通知TableView删除该行 tableView.deleteRows(at: [indexPath], with: .automatic) } }确保数据源可变
检查event.name的声明,必须用var修饰为可变数组,否则remove(at:)不会生效:// 正确示例 var name: [String] = [] // 错误示例(不可变,无法修改) // let name: [String] = []验证行数代理方法正确性
确认numberOfRowsInSection方法严格返回数据源的数量,不能写死数值:func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.event.name.count }
关键注意点
- 必须遵循先改数据源,再更新TableView的顺序,不能颠倒。如果先调用
deleteRows再修改数据源,也会引发行数不匹配的错误。 - 若需要批量更新,可使用
beginUpdates()和endUpdates()包裹操作,但单条删除用上述方式即可。
内容的提问来源于stack exchange,提问作者Aristoteles Cajiza
相关产品推荐
相关产品推荐

