UITabelview的删除

时间:2023-03-09 22:15:12
UITabelview的删除
  1. 删除的效果

    • Automatic
      UITabelview的删除
    • Bottom
      UITabelview的删除
    • Fade
      UITabelview的删除
    • left
      UITabelview的删除
    • middle
      UITabelview的删除
    • none
      UITabelview的删除
    • right
      UITabelview的删除
    • top
      UITabelview的删除
  2. 简单删除
    先删除数据源里的数据,然后再删除cell,否者会报错

        let indexPath = NSIndexPath.init(forRow: 1, inSection: 0)
    let indexPath1 = NSIndexPath.init(forRow: 3, inSection: 0)
    //title是数据源
    self.titles.removeAtIndex(0)
    self.titles.removeAtIndex(0)
    self.tableView?.deleteRowsAtIndexPaths([indexPath,indexPath1], withRowAnimation: .Left)
    ``` 如果先删除cell,再删除数据库,会抛出exception
self.tableView?.deleteRowsAtIndexPaths([indexPath,indexPath1], withRowAnimation: .Left)
//title是数据源
self.titles.removeAtIndex(0)
self.titles.removeAtIndex(0)

2016-07-30 21:44:26.613 UITableViewLearn[14976:575144] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (4) must be equal to the number of rows contained in that section before the update (4), plus or minus the number of rows inserted or deleted from that section (0 inserted, 2 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

UIKit在调用deleteRowsAtIndexPaths时,会判断前后数据源的一致性,如果前后不一致,会抛出异常。然而只是判断cell的个数是否一致。如果删除了第0、1列的数据,然后删除第2、3列的cell,也不会报错。

    let indexPath = NSIndexPath.init(forRow: 2, inSection: 0)
let indexPath1 = NSIndexPath.init(forRow: 3, inSection: 0)
//title是数据源
self.titles.removeAtIndex(0)
self.titles.removeAtIndex(0)
self.tableView?.deleteRowsAtIndexPaths([indexPath,indexPath1], withRowAnimation: .Left)

上面的不会报错

  1. 简单插入

    同样是先插入数据,再插入cell。

    self.titles.insert("insert", atIndex: 1)
    self.tableView?.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Left)
  2. 同时删除和插入

    • 准备数据源
    • 调用beginUpdates()
    • 调用deleteRowsAtIndexPaths, insertRowsAtIndexPaths:等方法
    • 调用endUpdates方法
  3. 对indexPath进行操作的次序

    • 在一个animation block(beginUpdates()endUpdates之间的部分)中,所有的插入选择操作都发生在删除操作之后
    • 删除和reload操作的指定的indexpath是原来tableView(未发生动画之前)的indexPath
    • 插入操作指定的indexPath是前面代码执行完成以后的新tableView的indexPath。
      于此对比,如果对一个mutable数组进行插入和删除,那么前面的删除和插入操作会改变这个数组某个元素的index。