Swift UITableView执行删除操作,以及两种报错原因解决方案

因项目需要,在UITableView中需要使用左滑删除操作,首选系统默认delete操作。

例如,需要实现的两个方法如下:

注意:下面使用的tableView是多section的。

// MARK: UITableViewDataSource
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            // 移除数组中的数据
            self.delegateData()

            // 更新tableView数据源
            ......

            // 移除当前row
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

        }
    }

// MARK: UITableViewDelegate
 func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
        return .Delete
    }

报错1:

Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-3318.0.1/UITableView.m:1582

原因:在执行deleteRowsAtIndexPaths方法前,先要删除数组中得相应数据,再更新tableView的数据源

报错2:

当你删除section中得一个cell时,解决了错误1,你会发现只要当前section中cell的数量数量大于1,可以任意执行删除操作,但是删除最后一个cell的时候程序崩了,这是因为此时你需要做的是删除整个section。即方法:deleteRowsAtIndexPaths


下面是一个完整版的,仅供参考:

    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
            // 先移除数据,在执行删除操作
            var entityArray = self.orders[indexPath.section].1
            let entity = entityArray[indexPath.row]
            LocalNotificationUtils.deleteNotification(entity.orderId)

            //更新数据源
            self.orders =  LocalNotificationUtils.localNotifications()
            
            // 如果当前section中row还剩余一个,则移除整个section
            if entityArray.count == 1 {
                tableView.deleteSections(NSIndexSet(index: indexPath.section), withRowAnimation: .Fade)
            } else {
                tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
            }
        }
    }

你可能感兴趣的:(Swift UITableView执行删除操作,以及两种报错原因解决方案)