因项目需要,在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)
}
}
}
网友评论