iOS开发——UI进阶篇(四)tableView的全局刷新,局部刷新,左滑操作,左滑出现更多按钮,进入编辑模式,批量删除,自定义批量删除
首先创建项目,在storyboard如下布局控件,设置好约束

然后创建cell模型类XMGWineCell
数据模型类XMGWine
创建UITableView,设置数据源协议,实现数据源方法
懒加载数据
这些在前面已经做过很多次了,代码就不一一写了
一、全局刷新
1、添加单组数据并全局刷新
- (IBAction)add {
// 添加模型数据
XMGWine *wine = [[XMGWine alloc] init];
wine.money = @"20.5";
wine.name = @"很好喝的酒";
wine.image = @"new_wine";
[self.wineArray insertObject:wine atIndex:];
// 告诉tableView:模型数据改变了,赶紧刷新表格
[self.tableView reloadData];
}
2、删除单组数据并全局刷新
- (IBAction)remove {
// 删除模型数据
[self.wineArray removeObjectAtIndex:];
[self.wineArray removeObjectAtIndex:];
// 告诉tableView:模型数据改变了,赶紧刷新表格
[self.tableView reloadData];
}
3、更改数据并全局刷新
- (IBAction)update {
// 更改模型数据
XMGWine *wine = self.wineArray[];
wine.money = @"";
XMGWine *wine2 = self.wineArray[];
wine2.name = @"哈哈";
// 告诉tableView:模型数据改变了,赶紧刷新表格
[self.tableView reloadData];
}
二、局部刷新
1、添加多组数据并局部刷新
- (IBAction)add {
// 添加模型数据
XMGWine *wine = [[XMGWine alloc] init];
wine.money = @"20.5";
wine.name = @"很好喝的酒";
wine.image = @"new_wine";
[self.wineArray insertObject:wine atIndex:];
XMGWine *wine2 = [[XMGWine alloc] init];
wine2.money = @"100.5";
wine2.name = @"很好";
wine2.image = @"new_wine";
[self.wineArray insertObject:wine2 atIndex:];
// 刷新
NSArray *indexPaths = @[
[NSIndexPath indexPathForRow: inSection:],
[NSIndexPath indexPathForRow: inSection:]
];
[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight];
}
2、删除多组数据并局部刷新
- (IBAction)remove {
// 删除模型数据
[self.wineArray removeObjectAtIndex:];
[self.wineArray removeObjectAtIndex:];
// 刷新
NSArray *indexPaths = @[
[NSIndexPath indexPathForRow: inSection:],
[NSIndexPath indexPathForRow: inSection:]
];
[self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationMiddle];
}
3、修改多项数据并局部刷新
- (IBAction)update {
// 更改模型数据
XMGWine *wine = self.wineArray[];
wine.money = @"";
XMGWine *wine2 = self.wineArray[];
wine2.image = @"new_wine";
XMGWine *wine3 = self.wineArray[];
wine3.image = @"new_wine";
// 局部刷新
NSArray *indexPaths = @[
[NSIndexPath indexPathForRow: inSection:],
[NSIndexPath indexPathForRow: inSection:],
[NSIndexPath indexPathForRow: inSection:]
];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationLeft];
}
三、左滑操作
先设置代理
1、只要实现了这个方法,左滑出现Delete按钮的功能就有了
点击了“左滑出现的Delete按钮”会调用这个方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
// 删除模型
[self.wineArray removeObjectAtIndex:indexPath.row]; // 刷新
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}
2、修改Delete按钮的文字
/**
* 修改Delete按钮文字为“删除”
*/
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
return @"删除";
}
四、左滑出现更多按钮
/**
* 左滑cell时出现什么按钮
*/
- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewRowAction *action0 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"关注" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
NSLog(@"点击了关注"); // 收回左滑出现的按钮(退出编辑模式)
tableView.editing = NO;
}]; UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
[self.wineArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}]; return @[action1, action0];
}
五、进入编辑模式

我们先将删除按钮改一改
- (IBAction)remove {
// (上面的没动画效果,下面有动画效果)
// self.tableView.editing = !self.tableView.isEditing;
[self.tableView setEditing:!self.tableView.isEditing animated:YES];
}
点击按钮之后左边会出现红色圆点,点击红点的效果和左滑是一样的,都可以进入编辑模式
六、批量删除

重新设置按钮
// 批量删除按钮
- (IBAction)multipleRemove {
[self.tableView setEditing:!self.tableView.isEditing animated:YES]; self.removeButton.hidden = !self.tableView.isEditing;
} - (IBAction)remove {
// self.tableView.indexPathsForSelectedRows = [0, 1] // 获得需要删除的酒模型数据
NSMutableArray *deletedWineArray = [NSMutableArray array];
for (NSIndexPath *indexPath in self.tableView.indexPathsForSelectedRows) {
[deletedWineArray addObject:self.wineArray[indexPath.row]];
} // 删除模型数据
[self.wineArray removeObjectsInArray:deletedWineArray]; // 刷新
[self.tableView deleteRowsAtIndexPaths:self.tableView.indexPathsForSelectedRows withRowAnimation:UITableViewRowAnimationLeft];
}
并且在viewDidLoad中设置
// 编辑模式的时候可以多选
self.tableView.allowsMultipleSelectionDuringEditing = YES; // 隐藏删除按钮
self.removeButton.hidden = YES;
以上代码就能实现系统自带的批量删除
七、自定义批量删除
功能:在选中后添加一个图片来标记,所有标记的都可以批量删除
1、首先在数据模型XMGWine中添加属性checked
/** 是否被勾选 */
@property (nonatomic, assign, getter=isChecked) BOOL checked;
2、实现代理方法,判断打钩控件显示还是隐藏
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// 修改模型
XMGWine *wine = self.wineArray[indexPath.row];
wine.checked = !wine.isChecked; // 刷新
[tableView reloadData];
}
注意:核心思想 "修改数据模型从而达到修改cell的目的"
如果直接在cell上添加一个图片来标记选定与否,那么在cell复用时会出现问题,你会发现往下滑 下面的有些cell也有图片标记,记住,一般MVC模式中都是修改数据
那么在这里我们已经修改了wine.checked的值,下一步在cellForRowAtIndexPath方法中赋值时(也就是说在要显示cell之前),在- (void)setWine:(XMGWine *)wine方法中实现下面这一句
// 根据模型的checked属性决定打钩控件显示还是隐藏
self.checkImageView.hidden = !wine.isChecked;
3、删除所有被打钩的模型
- (IBAction)remove {
// 获得所有被打钩的模型
NSMutableArray *deletedWineArray = [NSMutableArray array];
for (XMGWine *wine in self.wineArray) {
if (wine.isChecked) {
[deletedWineArray addObject:wine];
}
}
// 删除所有被打钩的模型
[self.wineArray removeObjectsInArray:deletedWineArray];
// 刷新表格
[self.tableView reloadData];
}

iOS开发——UI进阶篇(四)tableView的全局刷新,局部刷新,左滑操作,左滑出现更多按钮,进入编辑模式,批量删除,自定义批量删除的更多相关文章
- iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档
1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...
- iOS开发——UI进阶篇(十五)Quartz2D介绍
一.Quartz2D简介 1.什么是Quartz2DQuartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作绘制图形 : 线条\三角形\矩形\圆\弧等绘制文字绘 ...
- iOS开发——UI进阶篇(三)自定义不等高cell,如何拿到cell的行高,自动计算cell高度,(有配图,无配图)微博案例
一.纯代码自定义不等高cell 废话不多说,直接来看下面这个例子先来看下微博的最终效果 首先创建一个继承UITableViewController的控制器@interface ViewControll ...
- iOS开发——UI进阶篇(十四)modal
一.modal与pushmodal从下面往上盖住原来的控制器,一般上一个控制器和下一个控制器没有什么关联时用modal,比如联系人的加号跳转页面,任何控制器都可以用modal push一般是上下文有关 ...
- iOS开发——UI进阶篇(十七)CALayer,核心动画基本使用
一.CALayer简介 1.CALayer在iOS中,文本输入框.一个图标等等,这些都是UIView你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个其实UIView之所以 ...
- iOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别
触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponde ...
- iOS开发——UI进阶篇(七)程序启动原理、打电话、发短信
一.Info.plist常见的设置 1.建立一个工程后,会在Supporting files文件夹下看到一个“工程名-Info.plist”的文件,该文件对工程做一些运行期的配置,非常重要,不能删除 ...
- iOS开发——UI进阶篇(一)UITableView,索引条,汽车数据展示案例
一.什么是UITableView 在iOS中,要实现展示列表数据,最常用的做法就是使用UITableViewUITableView继承自UIScrollView,因此支持垂直滚动,而且性能极佳 UIT ...
- iOS开发——UI进阶篇(十九)UISearchBar控件简介
最近用到搜索功能.总结一下 搜索,无疑可以使用UISearchBar控件! 那就先了解一下UISearchBar控件吧! UISearchBar控件就是要为你完成搜索功能的一个专用控件.它集成了很多你 ...
随机推荐
- ObjectInputStream类和ObjectInputStream类的使用
版权声明:本文为博主原创文章,未经博主允许不得转载. ObjectInputStream和ObjectInputStream类创建的对象被称为对象输入流和对象输出流. 创建文件输出流代码: FileO ...
- css013 构建基于浮动的布局
css013 构建基于浮动的布局 基于浮动的布局时利用float属性是网页上的元素并排,并创建列 float有三个值:left .right .none 1.假设要把一张图片浮动到网页的左侧 .flo ...
- DataView
表示用于排序.筛选.搜索.编辑和导航的 DataTable 的可绑定数据的自定义视图. DataView的功能类似于数据库的视图,他是数据源DataTable的封装对象,可以对数据源进行排序.搜索.过 ...
- javascript Date format(js日期格式化)
这个用这比较爽,记录一下// 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年( ...
- JavaWeb学习笔记——Ajax
- 几个有用的jQuery代码片段
1.检测Internet Explorer版本 $(document).ready(function() { if (navigator.userAgent.match(/msie/i) ){ ale ...
- DIV CSS 网页兼容全搞定 (IE6 IE7 IE8 IE9 火狐 谷歌)
CSS兼容常用技巧 请尽量用xhtml格式写代码,而且DOCTYPE影响 CSS 处理,作为W3C标准,一定要加DOCTYPE声明. 1.div的垂直居中问题 vertical-align:middl ...
- PHP代码质量优化
最近总结了一些平常写PHP代码时的一些优化分享给大家. 1.尽量使用绝对路径 相对路径中会检查很多路径,这时我们可以使用绝对路径,但绝对路径不利于后期维护,所以define定义的时候使用__FILE_ ...
- Aspect Oriented Programming using Interceptors within Castle Windsor and ABP Framework AOP
http://www.codeproject.com/Articles/1080517/Aspect-Oriented-Programming-using-Interceptors-wit Downl ...
- php打印数组 --- 打印出漂亮格式的数组
htm的<pre>标签,能非常标准的显示数组格式 echo "<pre>";print_r($arr);echo "<pre>&quo ...