美好的一天!
我有一个具有EditingStyle的TableViewController:
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
machine.formulas.remove(at: indexPath.row)
machine.saveFormulas()
tableView.deleteRows(at: [indexPath], with: .fade)
tableView.reloadData()
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
每个单元格都有一个带有行号的标签。如果如上述代码中的.reloadData()中断了.deleteRows()动画。我尝试了不同的变化,使用beginUpdates()和.reloadRows(),没有任何结果得到所需的结果。我认为有一个简单的解决方案,但我无法弄清楚。
编辑:
已编辑代码,因此首先将其从数组中移除,然后从tableView中移除。
示例:
如果删除第5行,如何.reloadData()以便一切正常。我的意思是不会有1-2-3-4-6-7-8-9-10。以及如何在不破坏.Delete动画的情况下重新加载它?
答案 0 :(得分:1)
只需从代码中删除tableView.reloadData()
,就不需要了。
您的替代方法应为
override func tableView(_ tableView: UITableView, commit editingStyle:
UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
machine.formulas.remove(at: indexPath.row)
machine.saveFormulas()
tableView.deleteRows(at: [indexPath], with: .fade)
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
答案 1 :(得分:0)
只需从数据源中删除并删除该行即可,无需重新加载它。
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
machine.formulas.remove(at: indexPath.row)
machine.saveFormulas()
tableView.deleteRows(at: [indexPath], with: .fade)
self.perform(#selector(reloadTable), with: nil, afterDelay: 2)
} else if editingStyle == .insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
@objc func reloadTable() {
self.tableView.reloadData()
}
尝试并分享结果。
编辑:
您应该更新cellForRow方法以基于indexPath而不是从numbersArray设置值
因为,最初numberArray具有所有10个值。 1,2,3,4,5,6,7,8,9,10 现在,如果您从第4行中删除一行,则该特定值将从数组中删除并保留9个项,即 1,2,3,5,6,7,8,9,10 和将在单元格中看到它们。相反,您应该更新cellForRow以显示indexPath.row +1。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = "\(indexPath.row + 1)"
return cell
}
希望它清除。
答案 2 :(得分:0)
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
machine.formulas.remove(at: indexPath.row)
machine.saveFormulas()
tableView.deleteRows(at: [indexPath], with: .fade)
self.perform(#selector(reloadTable), with: nil, afterDelay: 2)
}
}
@objc func reloadTable() {
DispatchQueue.main.async { //please do all interface updates in main thread only
self.tableView.reloadData()
} }
答案 3 :(得分:0)
尝试从数组中删除项目,删除行,然后在使用完成处理程序后重新加载 TableView:
所以创建这个方法(Swift 5):
func deleteRow(atIndexPath indexPath: IndexPath, completion: () -> Void) {
self.dataArray.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .automatic)
completion()
}
然后在任何需要的地方都这样调用它:
func clearDataItem(atIndexPath indexPath: IndexPath) {
deleteRow(atIndexPath: indexPath) {
tableView.reloadData()
}
}