UITabelview的删除

  1. 删除的效果
  • Automatic


    UITabelview的删除_第1张图片
  • Bottom


    UITabelview的删除_第2张图片
  • Fade


    UITabelview的删除_第3张图片
  • left


    UITabelview的删除_第4张图片
  • middle


    UITabelview的删除_第5张图片
  • none


    UITabelview的删除_第6张图片
  • right


    UITabelview的删除_第7张图片

    -top


    UITabelview的删除_第8张图片
  • 简单删除
    先删除数据源里的数据,然后再删除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)

上面的不会报错

  • 简单插入
    同样是先插入数据,再插入cell。
        self.titles.insert("insert", atIndex: 1)
        self.tableView?.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Left)
``
- 同时删除和插入
   - 准备数据源
   - 调用`beginUpdates()`
   - 调用`deleteRowsAtIndexPaths`,  `insertRowsAtIndexPaths:`等方法
   - 调用`endUpdates`方法
**对indexPath进行操作的次序**
  - 在一个animation block(`beginUpdates()`和`endUpdates`之间的部分)中,所有的**插入**和**选择**操作都发生在**删除**操作之后
  - 删除和reload操作的指定的indexpath是原来tableView(未发生动画之前)的indexPath
  - 插入操作指定的indexPath是前面代码执行完成以后的新tableView的indexPath。
于此对比,如果对一个mutable数组进行插入和删除,那么前面的删除和插入操作会改变这个数组某个元素的index。

你可能感兴趣的:(UITabelview的删除)