UITableView是我们最常用的控件了,今天我就来介绍一些关于UITableView的黑科技和一些注意的地方。

1.修改左滑删除按钮的高度

  左滑删除这是iOS最先发明的,之后安卓开始模仿。有时候我们需要对他进行自定义,比如添加图片啊,修改字体和大小啊,其实这个可以很简单。

- (void)layoutSubviews {

    [super layoutSubviews];

    for (UIView *subview in self.subviews) {
if ([subview isKindOfClass:NSClassFromString(@"UITableViewCellDeleteConfirmationView")]) {
// 修改左滑删除按钮的高度
CGRect frame = subview.frame;
frame.size.height = self.frame.size.height - 10;
subview.frame = frame; for (UIButton*deleteBtn in subview.subviews) { if ([deleteBtn isKindOfClass:[UIButton class]]) { // deleteBtn 就是那个删除按钮 在这里自定义按钮的字体、背景色、添加图片等
[deleteBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
}
} break;
}
}
}

  UITableViewCellDeleteConfirmationView就是删除按钮所在的View。我这次的需求如下图:



由于删除按钮的高度和cell的高度是一致的,所以会出现左面的效果。不过用户看起来就会很别扭,因为用户理解的cell是不包括灰条的,所以我们就需要修改删除按钮的高度,其实也就是修改UITableViewCellDeleteConfirmationView的高度。同时,我们也可以自定义按钮的样式,例如背景色,字体,添加图片等。

  但是我发现这样自定义删除按钮之后,删除起来非常卡顿,因为每次cell布局都需要执行一次for循环,影响效率。所以我强烈建议用下来的方法。

- (void)willTransitionToState:(UITableViewCellStateMask)state {

    [super willTransitionToState:state];
if (state == UITableViewCellStateShowingDeleteConfirmationMask) { for (UIView *subview in self.subviews) {
if ([subview isKindOfClass:NSClassFromString(@"UITableViewCellDeleteConfirmationView")]) {
// 修改左滑删除按钮的高度
CGRect frame = subview.frame;
frame.size.height = self.frame.size.height - 10;
subview.frame = frame; for (UIButton*deleteBtn in subview.subviews) { if ([deleteBtn isKindOfClass:[UIButton class]]) { // deleteBtn 就是那个删除按钮 在这里自定义按钮的字体、背景色、添加图片等
[deleteBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
}
} break;
}
}
}
}

  不过遍历UITableViewCellDeleteConfirmationView必须延时执行,因为UITableViewCellDeleteConfirmationView是懒加载的,不延时执行,遍历不到UITableViewCellDeleteConfirmationView。

2.删除cell之后刷新表格

  删除cell之后需要刷新表格,以前我都是用- (void)reloadData; ,但是如果表格里的cell很多,频繁的删除,手机就卡死了。因为我们只是删除一行,却需要刷新整个表格,太浪费资源了。我就想有没有可能像只刷新一行、一段那样的方法呢,后来我发现了下面的方法,非常好。

- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;

他的用法和刷新一行一段完全一样,但是animation这个参数应该是无效的,因为你无论怎么改动画都没有改变。

    [self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];

注意:1.一定要在删除数据源之后,在执行上面的方法。否则会崩溃,报下面的错误:

*** Assertion failure in -[ShopCarTableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-3318.16.21/UITableView.m:1582
libc++abi.dylib: terminate_handler unexpectedly threw an exception

2. [self.tableView beginUpdates];和 [self.tableView endUpdates];两句代码可以省略,分别表示开始更新和结束更新,这个更新包括insert、delete、move、reload。

3.用这个方法容易报下面的错误。

attempt to delete row 4 from section 0 which only contains 4 rows before the update

这是友盟返回的错误,我定位到错误的位置,反复的删除cell,也没有闪退。我就百思不得其解,上网百度也没有发现有价值的信息。后来我发现:假设一个表格有5行,每行的index分别是0,1,2,3,4。如果我删除了第四行,每行的index就应该变为0,1,2,3,也就是说原来的第五行变成了第四行,index应该是3,但用于没有刷新整个表格,他的index仍然是4,我按照index = 4来刷新这个cell就报上面的错误。是不是有点复杂,没懂。简单一句话,执行了deleteRowsAtIndexPaths方法,表里的每个cell的indexPath都应该发生变化,但是没有 。其实不是每个,应该是删除那个cell下面的cell会有变化,便于理解所以说每个。

  这就尴尬了,是不是又得刷新整个表格了。当然不是了,但是我们不能直接用cell的indexPath刷新它了。每个cell都有一个数据,根据这个数据在整个数据源中的位置来重新获取它的indexPath,刷新cell。

    GoodsModel *goods = notification.object[@"goods"];
NSUInteger index = [self.tableView.shopCarArr indexOfObject:goods];
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationNone];

  好司机,都是用汽油堆起来的!说的真对,做的项目多了,遇到的问题也就多,迫使我们去解决问题,阅读苹果的API。官网API写的真的很详细,也很易懂,不需要有多高的英语造诣,对提高自己真的很有帮助。另外,这几天的一句经验之谈,任何一个小问题,都不能放过,赶紧解决,否则有可能会酿成大错。

iOS 关于UITableView的黑科技的更多相关文章

  1. Android黑科技,读取用户短信+修改系统短信数据库

    安卓系统比起ios系统最大的缺点,相信大家都知道,就是系统安全问题.这篇博客就秀一波“黑科技”. 读取用户短信 Android应用能读取用户手机上的短信,相信已经不是什么新鲜事,比如我们收到的短信验证 ...

  2. 【转载】史上最全:TensorFlow 好玩的技术、应用和你不知道的黑科技

    [导读]TensorFlow 在 2015 年年底一出现就受到了极大的关注,经过一年多的发展,已经成为了在机器学习.深度学习项目中最受欢迎的框架之一.自发布以来,TensorFlow 不断在完善并增加 ...

  3. iOS中UITableView和UICollectionView的默认空态页

    项目中想实现空态页风格统一控制的效果,就封装了一个默认空态页,使用的技术点有:1 方法替换 ,2 给分类(Category)添加属性. 我们知道,扩展(extension)可以给类添加私有变量和方法. ...

  4. 微软AI发布会,集齐六大亮点召唤黑科技!

    7月12日,微软合作伙伴大会Inspire在华盛顿特区如火如荼地举行.同一天,在相隔5个时区的伦敦,微软还举办了一场关于人工智能的发布会.这是一场智能技术和情感体验两相交融的科技盛宴,既有黑科技,也有 ...

  5. qt的应用层主要是大型3d,vr,管理软件和器械嵌入软件(有上千个下一代软件黑科技项目是qt的,美国宇航局,欧洲宇航局,超级战舰DDG1000)

    作者:Nebula.Trek链接:https://www.zhihu.com/question/24316868/answer/118944490来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  6. [转帖]新iPhone的黑科技:UWB技术揭秘

    新iPhone的黑科技:UWB技术揭秘 http://blog.nsfocus.net/iphone-black-technology-uwb-technology-revealed/    阅读:  ...

  7. 聊聊H5与JS近几年的黑科技

    聊聊H5与JS近几年的黑科技 自ajax技术的诞生,编程界兴起了一股WEB开发热,facebook,Twitter等众多大佬级企业都在网页应用上大放异彩,这十年我们见证了前端技术的崛起.这期间产生了众 ...

  8. ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】

     FZU 2105  Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  9. 黑科技项目:英雄无敌III Mod <<Fallen Angel>>介绍

    英雄无敌三简介(Heroes of Might and Magic III) 英3是1999年由New World Computing在Windows平台上开发的回合制策略魔幻游戏,其出版商是3DO. ...

随机推荐

  1. PL/SQL编程重点语句输出整理

    create or replace procedure pr_mytest is v_test number() :=; v_char varchar2():='数据库'; c_changl cons ...

  2. cloud-init 工作原理 - 每天5分钟玩转 OpenStack(171)

    cloud-init 是 linux 的一个工具,当系统启动时,cloud-init 可从 nova metadata 服务或者 config drive 中获取 metadata,完成包括但不限于下 ...

  3. 设置ARC有效或者无效

    在编译单位上,可以设置ARC有效或者无效.比如对每个文件可以选择使用或者不使用ARC,一个应用程序中可以混合ARC有效或者无效的二进制形式. 设置ARC有效的编译方法如下所示:(Xcode4.2开始默 ...

  4. JavaScript--------------------jQuery中.bind() .live() .delegate() .on()的区别 和 三种方式写光棒事件 动画

    bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数. $("a").bind("click",function(){alert( ...

  5. Java 判断回文字符串有多少和其中的最大字符串

    一.简介代码功能 该代码的功能可以实现对任意的一段字符串进行判断是否有回文,回文有哪些,和其中的最大回文. 二.代码部分 1.全局变量 static String hws = "" ...

  6. 装饰器模式(Decorator)——深入理解与实战应用

    本文为原创博文,转载请注明出处,侵权必究! 1.初识装饰器模式 装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能.其结构图如下: Component为统一接口,也是装饰类和被装 ...

  7. 基于opencv的车牌识别系统

    前言 学习了很长一段时间了,需要沉淀下,而最好的办法就是做一个东西来应用学习的东西,同时也是一个学习的过程. 概述     OpenCV的全称是:Open Source Computer Vision ...

  8. struts2 之 struts2类型转换

    1. 在struts2中,相比servlet来时,获取数据时,程序员没有进行手动的类型转换,类型转换工作都有struts2来完成处理,但愿对于自定义类型数据,struts2不会帮助我们完成类型转换工作 ...

  9. jQuery制作右侧边垂直二级导航菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 光场相机重聚焦之三——Matlab光场工具包使用、重聚焦及多视角效果展示

    这一小节说一下Matlab光场工具包的使用,展示重聚焦和多视角的效果. 从Lytro illum中导出的raw数据为.lfp格式的光场图像文件(约52M大小),该文件包含以下几部分:光场图像数据raw ...