about iOS

UITabelview的删除

2016-07-30  本文已影响88人  我是花老虎
  1. 删除的效果

·```
如果先删除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)

上面的不会报错

        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。

上一篇下一篇

猜你喜欢

热点阅读