释放双眼,带上耳机,听听看~!

UITableView的编辑模式

实现UITableView简单的删除功能(左滑出现删除按钮)

首先UITableView需要进入编辑模式。实现下面的方法,即使什么代码也不写也会进入编辑模式:

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

{

}

当点击出现的Delete按钮时,会调用上面这个方法,所以在这个方法里面可以实现进行删除操作的一些逻辑,比如:

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

{

// 首先修改model

[self.books removeObjectAtIndex:indexPath.row];

// 之后更新view

[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

}

如果想要修改Delete这个按钮的文本,可以实现下面的代理方法:

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath

{

return @"删除";

}

这种方式可以很快捷的实现系统自带的简单删除方法,并且当UITableView进入编辑模式的时候(出现Delete按钮),继续点击cell则会自动取消编辑模式,非常方便。

在一些应用中可能会看到,当用户点击一个按钮的时候,UITableView里面的cell的左边会出现一个红色圆,里面是一个-,当点击这个-的时候会出现左滑效果,出现Delete按钮。如何实现的呢?

UITableView有一个editing属性,如果将这个属性设置为YES,那么就会进入编辑模式;同样,设置为NO,就会退出。

上面的提到的例子,当用户点击按钮的时候,就进入编辑模式,编辑模式默认的形式就是在左边有一个红色-,当用户点击的时候自带左滑效果出现Delete按钮。当用户点击Delete按钮的时候又会调用上面提到的方法。

所以说了这么多,只需要将editing设置为YES并实现上面的方法就可以达到上述效果。

UITableViewCell的重用

UITableViewCell如果在tableView:cellForRowAtIndexPath:方法中,像其他类一样,使用下面的方式创建:

UITableViewCell *cell = [[UITableViewCell alloc] init];

cell.textLabel.text = @"hello";

...

这样虽然能正确显示,但是性能是有问题的。

苹果实际上是帮我们提高了性能了的。假设要显示200行数据,如果同时创建200个cell,那么无疑会非常消耗性能,并且并没有太大的意义——因为有些cell根本还没有显示出来。

所以在使用UITableView的时候,只有在cell即将显示的时候才会调用tableView:cellForRowAtIndexPath:方法,也就是说,如果有200行数据,那么只会创建我们可以看到的cell,而那些看不到的数据,则不会创建对应的cell。

比如在手机屏幕上可以同时显示5个cell(编号为0 – 4),那么当用户向上滑tableView的时候,第6个cell即将出现,而第1个cell还未消失,所以此时会创建6个UITableViewCell。当第7个cell出现,那么第1个cell就会完全从屏幕上消失,此时这个UITableViewCell的对象将被销毁,并且第7个cell被创建。以此类推,当有新的cell出现,那么就会创建一个新的cell,销毁消失的那个cell。

这样虽然不必同时创建200个cell,但是在不断地创建-销毁cell,性能上依然会有问题。

苹果提供的更好的方法是将cell复用,而不是销毁。

每次有新的cell出现的时候(也就是tableView:cellForRowAtIndexPath:方法执行的时候),不应该直接创建一个cell,而是应该去缓冲池中查找有没有可复用的cell,如果有,那么就重用这个cell;如果没有,则创建一个cell。这样无论数据是200行,2000行还是20000行,实际上创建的只是屏幕可见的cell的个数。

还是上面的例子,当第7个cell即将出现,第1个cell消失,此时并不会销毁第一个cell,而是将它放入缓冲池中等待复用。此时第7个cell会首先去缓冲池中寻找是否有可复用的cell,发现有(就是消失的第1个cell),那么就会拿来复用,而不是重新创建。这样一来,消失一个,下次就会重用这个,这样就可以保证创建最少数量的cell,仍然可以满足需求。

实现cell的重用可以采用下面的方法:

使用代码自己来创建新的cell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

NSString * const cellIdentifier = @"CellIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (!cell) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

cell.backgroundColor = [UIColor greenColor];

}

cell.textLabel.text = @"hello";

return cell;

}

这里有几点需要注意:

当cell为nil,需要创建新的cell的时候,使用的是initWithStyle:reuseIdentifier:方法,而不是init方法,这样做是因为创建新的cell的时候需要绑定一个identifier,这样在重用的时候才能找到可重用的相同类型。如果使用init方法则没有绑定identifier,这样在重用的时候无法成功找到对应的可重用的cell。

一般在if(!cell)中,也就是在新创建cell的时候,将一些只需要初始化一次的属性进行初始化,而不是在这个括号的外面。因为在括号外面会执行多次,而这些属性并不需要多次设置。同样,如果不同的cell需要设置不同属性或数据,那么需要在括号外执行,因为括号外面每次cell出现都会执行到,这样可以保证不用的cell对应不同的属性或数据。如果将本该设置不同cell对应不同属性的代码放在括号里面,在复用cell的时候不会重新覆盖这些数据,会出现不正确的结果,早晨数据冗余的问题。

另一种方法是自动创建新的cell:

NSString * const cellIdentifier = @"CellIdentifier";

- (void)viewDidLoad

{

[super viewDidLoad];

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

cell.textLabel.text = @"hello";

return cell;

}

首先需要注册class,意思就是告诉tableView,首先去缓冲池中找有没有可重用的cell,如果有,则拿过来重用;如果没有,那么根据之前注册的UITableViewCell这个类,来自动生成一个cell,并且给它绑定上重用identifier。

这个方法省去了我们自己手动创建cell,但是也有不足:苹果提供给我们的cell的样式,除了默认的,我们都不能用了。

第一种方法我们通过手动创建cell,使用initWithStyle:reuseIdentifier:可以传入不同的style来创建苹果为我们提供的cell,但是在第二种方法中无法实现了。

第二种方法更多的时候用在我们自定义Cell。虽然无法使用更多的系统自带样式,但是我们首先可以注册自定义的cell的类(将UITableViewCell换成自定义的Cell),然后仍然首先去缓冲池中找有没有可重用cell,如果没有,则根据注册的cell来创建cell并绑定identifier。当然,在使用dequeueReusableCellWithIdentifier:的时候,返回的应该也是自定义的Cell类型。

注册的不仅可以是Class,还可以是nib,也就是说可以注册通过xib创建的cell,和上面的方法同理。

还可以直接通过Storyboard,设置好prototype cell的identifier,在dequeueReusableCellWithIdentifier:中就可以直接使用cell,既不用提前注册,也不用手动创建cell。

ios 开发设置左滑退出_iOS 开发UITableView左滑出现删除按钮的运用方法相关推荐

  1. ios 开发设置左滑退出_iOS 关闭系统左滑动返回

    禁用滑动返回手势需要在改界面的ViewController中添加如下代码 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:ani ...

  2. ios view 切上部分圆角_IOS开发入门之给view添加圆角并指定位置

    本文将带你了解IOS开发入门之给view添加圆角并指定位置,希望本文对大家学IOS有所帮助. ios中给view添加圆角并指定位置 在ios开发中,为了有个不错的UI交互效果,我们经常会用到为视图添加 ...

  3. ios 仿电脑qq登录界面_iOS开发UI篇—模仿ipad版QQ空间登录界面

    iOS开发UI篇-模仿ipad版QQ空间登录界面 一.实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的 ...

  4. ios 仿电脑qq登录界面_iOS开发UI篇—模仿ipad版QQ空间登录界面-阿里云开发者社区...

    一.实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的设置 (1)设置第一个控制器和自定义的控制器类(登 ...

  5. iOS开发能用mysql吗_iOS开发之数据库的简单使用

    数据库基础知识: plist:writetoFile,条件:只有一个对象拥有这个方法,才能使用plist存储,而且自定义对象不能用plist存储 Preference:偏好设置存储:NSUserDef ...

  6. ios 持续获取定位 高德地图_iOS开发-- 高德地图的接入使用(1)定位

    单次定位 @property(nonatomic,strong)AMapLocationManager * locationManager;// 开启定位 // 懒加载创建你的定位的Manager - ...

  7. ios 点生成线路 百度地图_iOS开发-集成百度地图(OC语言)

    一.申请安全码 图1-1 申请安全码 二.导入SDK,添加依赖库 1.根据项目需求(定位?路径规划?)下载所需要的SDK包,传送门:下载百度地图SDK,并拖进项目中. 图2-1 导入SDK 2.添加依 ...

  8. ios 如何在cell中去掉_iOS开发:关于 去除UITableViewCell复用机制 的几种方法

    UITableView继承自UIScrollview,是苹果为我们封装好的一个基于scroll的控件.上面主要是一个个的UITableViewCell,可以让UITableViewCell响应一些点击 ...

  9. ios 如何在cell中去掉_IOS之表视图单元格删除、移动及插入

    1.实现单元格的删除,实现效果如下 - (void)viewDidLoad { [super viewDidLoad]; //设置导航栏 self.editButtonItem.title = @&q ...

最新文章

  1. 11月13日科技联播:支付宝上线首张电子离婚证;网易云音乐敲定新一轮融资
  2. Mobile 拨打电话 发送短信
  3. oracle多表关联查询报表,oracle多表关联查询和子查询
  4. 当年的聊天室,今天的我(java实现聊天室群聊功能)
  5. leetcode之Insertion Sort List
  6. 前端使用linux命令更新项目生产包与测试包命令
  7. java openssl dgst_(7) openssl dgst(生成和验证数字签名)
  8. HBase配置(伪分布式模式)
  9. 字符串算法-Rabin-Karp
  10. 从零实现深度学习框架——过拟合与欠拟合
  11. 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)...
  12. 隧道监控计算机网络系统方案,高速公路隧道监控系统解决方案
  13. 一文搞懂MySQL索引所有知识点(建议收藏)
  14. Windows 工作/生活 小窍门收集
  15. 【考研英语语法】十大词性
  16. github提交时报错:remote: Support for password authentication was removed on August 13, 2021问题解决方案
  17. 深入解析Apache NIFI的调度策略
  18. nginx worker shutting down状态超时退出配置
  19. README.md的内容格式
  20. OSPF学习小结与实验

热门文章

  1. 跨境电商多商户系统怎么选
  2. 分享99个中国风ppt,总有一款适合你
  3. tp5学习记录:导入前端静态模板
  4. 设计模式五:原型模式
  5. GUI用户图形界面:GUILayout控件及使用例子
  6. 是什么引发了我对知识的渴望
  7. Revit二次开发小技巧(十二)创建带洞口的墙
  8. 无监督关键短语的生成问题博客02--extract.py的分析
  9. CAD初学者该掌握的用cad画图的基本…
  10. Python性能分析,Python可是无所不能的!