如何从Swift中的UITableView中删除部分?

时间:2016-01-30 05:06:30

标签: ios swift uitableview uikit

我是iOS和编程的新手,我正在尝试创建我的第一个应用程序。我已经搜索了一段时间来解决这个问题,但找不到一个。我有一个UITableView,单元格分为多个部分,我想让用户删除。我没有问题实现它,以便单元格删除,但我想删除其中有零个单元格的部分,这导致我的麻烦。我的numberOfSectionsInTableView和numberOfRowsInSection方法返回正确的数量。我的commitEditingStyle方法如下所示:(dataTable是一个类型为[String:[String]]的字典,我用它来存储每个单元格的信息,其中键是节头,值是该节中的单元格。)< / p>

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    if editingStyle == .Delete {

        dataTable[Array(dataTable.keys)[indexPath.section]]!.removeAtIndex(indexPath.row)
        if dataTable[Array(dataTable.keys)[indexPath.section]]!.count == 0 {

            dataTable.removeValueForKey(Array(dataTable.keys)[indexPath.section])
            tableView.deleteSections(NSIndexSet(index: indexPath.section), withRowAnimation: .Fade)

        } else {

            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

        }

    }

}

我相信我已经缩小了问题的范围,但我不知道如何解决它。当我调用tableView.deleteSections时,我收到错误

'Invalid update: invalid number of rows in section 1.  The number of rows
contained in an existing section after the update (1) must be equal to the
number of rows contained in that section before the update (3), plus or
minus the number of rows inserted or deleted from that section (0 inserted,
0 deleted) and plus or minus the number of rows moved into or out of that
section (0 moved in, 0 moved out).'

我相信这是因为当删除第1部分时,第2部分会向上移动到第1部分,第3部分到第2部分等,但每个部分中的单元格数量不会更新。在我的测试中,我发现只有在删除一个部分之后的每个部分与被删除的部分没有相同数量的单元格时才会出现此错误(因此只有当单元格数量减少到零时才删除该部分) )。我想解决这个问题我可以手动更新每个部分的单元格数量,但我不知道如何做到这一点。同样,问题不在于我返回的单元格数和节数不正确。任何帮助都会很棒,并提前感谢。

2 个答案:

答案 0 :(得分:1)

我找到了问题的解决方案,所以我想分享它。出于某种原因,我假设dataTable在删除对象后会保持其顺序,所以每次在我的代码中我都调用了dataTable.keys而是dataTable.keys.sort()

答案 1 :(得分:0)

您可以使用以下两种委托方法来处理部分删除:

func tableView(tableView: UITableView!, canEditRowAtIndexPath indexPath: NSIndexPath!) -> Bool {
  return true
}

func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) {
   if (editingStyle == .Delete) {
   // handle delete (by removing the data from your array and updating the tableview)

   self.tableView.beginUpdates()

   self.feedData.removeObjectAtIndex(indexPath.row) // also remove an array object if exists.
   self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Left)

   self.tableView.endUpdates()
}