更新数据
- 更新cell的数据,刷新表格,可以通过修改模型的方式进行
- 刷新的本质是让tableView重新调用数据源方法
- 数据刷新分为两种
- 局部刷新:刷新想要刷新的部分数据
- 更新:reloadRowsAtIndexPath:
- 添加: insertRowsAtIndexPath:
- 注意:局部刷新使用的前提:显示出来的cell的个数不变,在添加操作中,不能使用reloadRowsAtIndexPath:
- 删除: deleteRowsAtIndexPath:
- 全局刷新:刷新所有的cell表格
- reloadData
- 局部刷新:刷新想要刷新的部分数据
添加数据
- tableView展示多少数据是由数据源管理的,数据源管理的数据在数组中,要想添加数据,就要在数组中添加模型数据,把不可变数组改成可变数组属性,创建模型,给模型属性赋值
- 步骤
- 添加模型数据
- [self.dataArray insertObject:atIndex:]
- 刷新数据
- [self.tableView reloadData];
- insertRowsAtIndexPath:withRowAnimation:
- 添加模型数据
删除数据
- 删除数据的本质就是把cell对应的模型删除掉
- 删除模型数据
- [self.dataArray removeObjectAtIndexPath:]
- 刷新数据
- [self.tableView reloadData];
- deleteRowsAtIndexPath:withRowAnimation:
- 删除模型数据
左滑删除功能
- 代理方法来实现
- 只要实现这个方法,就拥有左滑删除功能;当用户点击了左滑删除按钮就会调用这个方法commitEditingStyle:forRowAtIndexPath:
- 修改左滑删除的显示的文字,delete是默认titleForDeleteConfirmationButtonForRowAtIndexPath
- 配置项目:本地化Localization,添加中文也可以将默认的delete改为删除
左滑【关注 | 删除】功能
- 实现代理方法
-
editActionsForRowAtIndexPath:
返回的是一个数组,数组里装的是UITableViewRowAction对象 - 实现了这个方法,系统的titleForDeleteConfirmationsButtonForRowAtIndexPath以及commitEditingStyle:forRowAtIndexPath:的方法就没有作用了
- 删除:destructive和默认的default样式是一样的
- 关注:Normal样式
-
如何平滑的返回?
- tableView的编辑模式属性
- self.tableView.editing = NO;默认是NO;
- 一旦进入编辑状态,就会改为YES
- 所以实现平滑的返回,可以设置这一个属性为NO;
- ios9之前必须实现commitEditingStyle:forRowAtIndexPath:这个方法,才能实现左滑删除功能,ios9之后,实现
editActionsForRowAtIndexPath:
这个方法,也可有左滑删除功能。
点击删除,左边出现减号按钮
- 让tableView进入编辑模式
- self.tableView.editing = YES;只要进入编辑模式就有减号
- 问题:减号按钮突然出现
- [self.tableView setEditing:animated:];
- 问题:点击cell没有反应,监听不了点击事件,只能删除
- self.tableView.editing = !self.tableView.isEditing;
批量删除
-
设置tableView的allowsMultipleSelectionDuringEditing = YES;
-
设置tableView在编辑模式下可以多选
-
开发原则:千万不要一边遍历,一边删除,遍历的时候要保证数组的长度不变,因为每删除一个元素,其他元素在数组中的索引可能会发生变化(从后往前不会变化,从前往后一定会发生变化)
-
正确做法
-
把要删除的几个cell对应的模型保存到数组中,把数组删除掉
-
遍历数组,拿到每一个要删除的模型
- NSMutableArray * temp
- 遍历indexPathsForSelectedRows
-
把模型保存到新的数组中
- [temp addObject:self.wineArray[indexPath.row]]
-
删除数组:removeObjectsInArray:temp
-
自定义批量删除
- 自定义cell
- 第一种做法:全部自己在cell上添加控件
- 第二种方法:在系统的三个控件的基础上,再添加一个控件
- 在initWithStyle:方法中添加子控件
- 设置打钩图片的属性
- 创建控件,添加子控件,给控件属性赋值
- 设置图片
- 在layoutSubViews中布局子控件
- Y值:(contentView的高度-自己的高度)*0.5
- 调整系统自带的textLabel的宽度
- 拿到textLabel的frame
- 改变textLabel的宽度
- 给控件的frame赋值
- 一开始隐藏,在初始化方法里,hidden = YES;
- 通过代理,监听cell的点击事件
- didSelectedRowAtIndexPath:
- cellForAtIndexPath:
- cell.checkImageView.hidden = !cell.checkImageView.isHidden;
- didSelectedRowAtIndexPath:
-
出现了cell的循环利用问题
- 在模型中搞一个属性,记录这行cell的打钩状态
- 来到didSelectedRow:
- wine.checked = !wine.checked;
- [self reloadData]
- 模型的set方法里,根据check属性决定打钩控件是显示还是隐藏
- 删除选中的cell
- 遍历所有的模型
- 删除模型
- 刷新表格
- 在initWithStyle:方法中添加子控件
- 存在问题:只删除一行,遍历了所有模型,性能不好!
网友评论