iOS UITableView 使用beginUpdates和e
说起tableview 大家都很熟悉吧,项目当中用的最多的也是这个控件了,那么 reloadData 也肯定不陌生了,有些时候在做一些评论页面或者类似朋友圈的时候,会遇到因为内容过长,不全部显示所有内容,那么想要查看全部内容就需要点击查看全部按钮或进入详情页查看了,
既然点击按钮可以查看全部内容,应该怎么操作呢?
1:大家一定会先想到将高度缓存,reloadData直接刷新一下,显示全部信息不就完了吗?
答案是错误的,别问我问什么,问度娘去吧。
2:可以选择刷新一行数据, 如下显示,
NSIndexPath *indexRow = [NSIndexPath indexPathForRow:0 inSection:0];
[tableview reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexRow] withRowAnimation:UITableViewRowAnimationNone];
这样操作的结果是:程序会走一遍高度方法 heightForRowAtIndexPath ,走完这个方法程序还会继续走 cellForRowAtIndexPath 这个方法,本来页面已经显示了,所有的方法都已经走完了,再走一次cellForRowAtIndexPath,如果cell 里面控件较多的话严重影响用户体验,
3:可以采用beginUpdates 和endUpdates 方法,
[Weakself.DetailTableView beginUpdates]; [Weakself.DetailTableView endUpdates];
这两个方法是组合使用,只能写在一起,分开写就不管用了,使用这个方法,程序只会走heightForRowAtIndexPath 这一个方法,就不会再走别的任何代理方法了。
image.png image.png重要的是这三步操作,重要的是这三步操作,重要的是这三步操作,
4: 在cellForRowAtIndexPath 方法里,将应该显示的model以及高度传递给cell,在cell 里面根据model控制应该如何显示,
5:在查看全部按钮的方法里,更改之前的约束即可,然后使用bock回调到cell 里面,beginUpdates 一下就可以了,
6:heightForRowAtIndexPath 在这个方法里,根据model属性返回相应高度即可。