美文网首页iOS开发技术分享
Swift UITableView执行删除操作,以及两种报错原因

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

作者: devchena | 来源:发表于2016-01-14 16:55 被阅读1534次

    因项目需要,在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执行删除操作,以及两种报错原因

        本文链接:https://www.haomeiwen.com/subject/msqhkttx.html