在TableView中.Delete之后更新行

时间:2018-08-27 09:48:53

标签: swift uitableview delete-row editing

美好的一天!

我有一个具有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中移除。

示例:

enter image description here

如果删除第5行,如何.reloadData()以便一切正常。我的意思是不会有1-2-3-4-6-7-8-9-10。以及如何在不破坏.Delete动画的情况下重新加载它?

4 个答案:

答案 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()
    }
}