错误: The number of sections contained in the table view after the update (1) must be equal to the number of sections contained in the table view before the update (2), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted).

功能思路其实不难,交代一下,我自己要实现的效果:
1.TableView是分组的。
2.点击删除按钮后,某行被删除。
 
写完大概功能,运行之后,出现:
 

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:1070

libc++abi.dylib: handler threw exception

 
原因:
1.在调用deleteRowsAtIndexPaths:方法前,要确保数据为最新。也就是说,先将要删除的数据从数据源中删除。
 
2.分组和分组中行数是变动的,不能写成死的!
 
3.如果是分组,你会发现很怪的现象:当一个分组中,有多条数据时,你删除其中一条,正确;当一个分组中,你要删除唯一的一条时,仍然会报出如上的错误!
 
本人,就是百思不得其解。反复调试,数据已经保持最新了的。
 
在网上搜了很多,却没有满意答案。
 
灵感闪过!~~~~
 
删除某个分组中的最后一条数据时,分组数,和行数都要变。这时候,只调用了deleteRowsAtIndexPaths方法。也就是说,只对行数进行了操作,但是没有对变动的分组进行操作!
查看帮助API,找到这么一个方法:deleteSections:方法!
加上去,在删除某个分组中最后一条记录时,将该分组也删除!
 
搞定!搞定!
 
最后,贴一下,实现的关键思路:
 
1.计算分组数。
 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

return [_arrKeys count];// _arrKeys中存放分组

}

 
2.计算每个分组中的个数。
 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

NSString* _date = [_arrKeys objectAtIndex:section];

NSArray* _notifications = [_dictData objectForKey:_date];// _dictData存放数据

return [_notifications count];

}

 
3.添加删除功能的代理方法(核心代码)。
 

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath

{

if (editingStyle == UITableViewCellEditingStyleDelete) {

[self refreshData];// 刷新_arrKeys和_dictData中的数据

int newCount=0;

if (indexPath.section<[_arrKeys count]) {

NSString *_date = [_arrKeys objectAtIndex:indexPath.section];

NSArray* _notifications = [_dictData objectForKey:_date];// _dictData存放数据

newCount= [_notifications count];

}

[tableView beginUpdates];

if (newCount<=0) {

[tableView deleteSections:[NSIndexSetindexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationLeft];

}

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationLeft];

[tableView endUpdates];

}

else if (editingStyle == UITableViewCellEditingStyleInsert) {

// 修改时

}

}

 
实现效果图:
 
总结:
1.遇到问题,查百度,谷歌!
2.先不忙写,做些小的Demo,搞清楚问题出在那里!
3.看苹果API(会告诉我们很多机制,原理性的东西)!
4.灵感!源于专注!
希望对你有所帮助!

iOS-分组UITableView删除崩溃问题(当删除section中最后一条数据崩溃的情况)的更多相关文章

  1. Bag标签之删除书包中的一条数据

    删除书包中的一条数据 查询 <esql module=help id=list> Select ID,Subject,Writer,DayTime From Messages </e ...

  2. mysql中删除重复记录,并保留重复数据中的一条数据的SQL语句

    正好想写一条删除重复语句并保留一条数据的SQL,网上查了一部分资料写的很详细,但还是在这里写下自己的理解,以遍后续学习 .如下: 表字段和数据: SQL语句: [sql] view plain cop ...

  3. mysql在group by分组后查询第二条/第三条乃至每组中任意一条数据

    昨天老板让我查询项目中(众筹),没人刚发起感召后,前三笔钱的入账时间和金额,这把大哥整懵逼了,group by在某些方面是好使,但这次不能为我所用了,获取第一笔进账是简单,可以用group by 直接 ...

  4. ACCESS删除datagridview和数据库中的一条数据,同时更新显示的方法源码

    //删除,行删除 private void 删除_Click(object sender, EventArgs e) { int dgrcount = dataGridView1.SelectedRo ...

  5. sql 选取每个分组中的第一条数据

    --1.创建测试表Create Table #Order1( OrderName varchar(50), RequestDate datetime, OrderCount int)-- 插入测试数据 ...

  6. oracle 根据字段分组取第一条数据及rank函数说明

    当前有这样一个需求,根据外键对子表数据进行分组,取每组中的一条数据就行了,如图: 如:COMMANDID = 26的有两条,只取一条数据. sql语句: select * from(select SY ...

  7. UITableVIew与UICollectionView带动画删除cell时崩溃的处理

    UITableVIew与UICollectionView带动画删除cell时崩溃的处理 -会崩溃的原因是因为没有处理好数据源与cell之间的协调关系- 效果: tableView的源码: ModelC ...

  8. iOS - UITableView 编辑(cell的插入, 删除, 移动)

    UITableView Cell的插入/删除 核心API Class : UITableView Delegate : UITableViewDataSource, UITableViewDelega ...

  9. iOS文件和文件夹的创建,删除,移动, 拷贝,是否存在及简单数据类型的读写

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

随机推荐

  1. 如何打开linux内核中dev_dbg的开关

    比如要打开某个驱动中的dev_dbg,那么需要在驱动文件.c中这些行"<linux/device.h>"或者"<linux /platfom_devic ...

  2. Eclipse FindBugs插件

    在线安装: Update Site:http://findbugs.cs.umd.edu/eclipse 本地安装: 1.首先从findbugs网站下载插件:http://findbugs.sourc ...

  3. C#中将一个引用赋值null的作用

    有类A,以及A类型的变量a和b.初始化a之后,将a赋给b.之后将a赋为null.之后b还是可以使用. 思维误区:本来以为a=null之后,b也应该等于null. 实际测试效果如下 class Prog ...

  4. Mac与Widow下编译与运行java文件引入多个外部jar包

    记录下,以后万一用得着呢 1.MAC环境下: 前提:在终端跳转到当前的源文件目录(cd xx), 并且配置好jdk,这里面不是重点 编译命令:注意连接用  :  号 javac -cp commons ...

  5. dpdk CUSE

    As the Userspace I/O HOWTO says For many types of devices, creating a Linux kernel driver is overkil ...

  6. 关于java.lang.Exception:No tests found matching的一系列解决方法

    问题描述: java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=yahaa], {ExactMatcher ...

  7. CSP(Content Security Policy) 入门教程

    参考: http://www.ruanyifeng.com/blog/2016/09/csp.html https://developer.mozilla.org/en-US/docs/Web/HTT ...

  8. Linux shell常用命令

    1. sz 和 rz  sz命令发送文件到本地: # sz filename rz命令本地上传文件到服务器: # rz 执行该命令后,在弹出框中选择要上传的文件即可.

  9. IntelliJ IDEA 左侧显示/展开类中的方法

    困扰我很久的问题: project直接右键: 打开.关闭对应效果: 之前查到的都是 : 虽然也有类似的功能,但是展开的是右侧窗口中,打开的那个类的: 即使不是我想要的,但也是不错的功能!

  10. Android--------工具类StatusBarUtil实现完美状态栏

    很早就想写这篇博客了,直到前几天有人问我这方面的问题才想起. 沉浸式状态栏是从android Kitkat(Android 4.4)开始出现的,顶部状态栏的颜色可以根据开发需求改变,使得APP风格更加 ...