从Swift 3中的UITableView删除一行?

时间:2016-10-20 13:45:42

标签: swift uitableview row

我是编程和学习swift的新手,我正在学习swift 2的教程并使用swift 3,因此我跟随时会遇到一些问题,这是一个我被正确卡住的问题上。

我有一个名字表,我正在为它们制作一个滑动和删除功能,它将它们从名称变量中删除,这是一个数组。我在xcode中选择了与教程最相似的函数并填写了它们,但是当我点击删除按钮时,我的应用程序随机崩溃。这是删除按钮的代码......

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

    let deleteAction = UITableViewRowAction(style: .destructive, title: "Delete") { (rowAction: UITableViewRowAction, indexPath: IndexPath) -> Void in

        print("Deleted")

        self.catNames.remove(at: indexPath.row)
        self.tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
        self.tableView.reloadData()
    }

9 个答案:

答案 0 :(得分:90)

适用于 Swift 3 Swift 4

使用UITableViewDataSource tableView(:commit:forRowAt:)方法,另请参阅此答案here

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
  if editingStyle == .delete {
    print("Deleted")

    self.catNames.remove(at: indexPath.row)
    self.tableView.deleteRows(at: [indexPath], with: .automatic)
  }
}

答案 1 :(得分:20)

首先你需要添加这个功能

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true 
}

那么你的功能还可以,但不需要tableview重新加载数据只需调用tableview.beingUpdatestableview.endUpdates

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
       print("Deleted")
       self.catNames.remove(at: indexPath.row)
       self.tableView.beginUpdates()
       self.tableView.deleteRows(at: [indexPath], with: .automatic)
       self.tableView.endUpdates() 
    }
}

答案 2 :(得分:7)

Swift 4 试试这个

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    func tableView(_ tableView: UITableView, commit editingStyle:   UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if (editingStyle == .delete) {
            arrStudentName.remove(at: indexPath.row)
            tableView.beginUpdates()
            tableView.deleteRows(at: [indexPath], with: .middle)
            tableView.endUpdates()
        }
    }

答案 3 :(得分:3)

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        self.animals.remove(at: indexPath.row)

        self.dataDisplayTbleView.reloadData()
    }

}

答案 4 :(得分:1)

我的回答

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool
{
     return true
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
{
    if editingStyle == .delete
    {
        array.remove(at: indexPath.row)
        tblDltRow.reloadData()
    }
}

您需要刷新表格

答案 5 :(得分:1)

**

for swift 3

**

  func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
      if editingStyle == .delete {
        print("Deleted")

        self.catNames.remove(at: indexPath.row)
        self.tableView.deleteRows(at: [indexPath], with: .automatic)
      }
    }

答案 6 :(得分:0)

    self.tableView.beginUpdates()
    self.tableView.deleteRows(at: [ IndexPath(row: index, section: section) ], with: .fade)
    self.remove_object_from_model()
    self.tableView.endUpdates()

答案 7 :(得分:0)

您不必重新加载tableView。

在使用tableView.deleteRows(at: [IndexPath], with: UITableView.RowAnimation)之前,必须确定要在numberOfRowsInSection中删除的行数

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return //Your current number of rows - The number of rows to delete

    }

通常行数是数组(yourArray.count)中的项目数,这意味着您可以在删除单元格并获得相同结果之前从此数组中删除项目。

答案 8 :(得分:0)

对于 Swift 5

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
      if editingStyle == .delete {
        print("Deleted")

        self.catNames.remove(at: indexPath.row)
        self.tableView.deleteRows(at: [indexPath], with: .automatic)
      }
    }