摘要
一年前写了一个表格视图的自定义组头视图的Demo,并且在Demo里面实现点击组头的时候刷新对应组Cell数据功能,由于当时只是实现这个类似扣扣好友列表的扩展式布局的功能,所以没有具体测试,今年写项目的时候正好遇见有这个功能的界面所以就直接按照原来的逻辑直接运用到项目中,今日看项目的时候发现了问题.
具体问题
- 当按照需求增加了分组的时候,再点击组头显示和影藏分组cell的时候,会出现组头错乱的问题.
- 通过视图层次结构发现自定义的cell中的图片,每点击组头显示一次cell的时候,图片就多添加一个图片层.
原因与解决方式
-
第一个问题原因
当我不停的点击组头的时候,通过视图层次发现显示的组头视图越来越多(一般多点击表格视图的底部几个分组比较容易出现这种问题),并且布局发生错乱.
后来经过调试发现我当我使用刷新点击的组头的视图对应的cell数据的时候,整个表格视图的布局会发生变化,其他没点击的自定义分组会随着我点击的这组布局的变化而变化, 因为点击,我只手动刷新了点击的组的数据,所以因为布局发生变化其他分组出现在视图上面的时候就会由系统负责刷新,自动走系统的代理方法刷新数据, 而恰恰正是这样导致的问题(目前只是猜测)解决方式
直接将组头视图的刷新方法变成全局刷新, view.YHTableViewHeaderViewExpandCallBack = ^(){ // [tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade]; [tableView reloadData]; };
-
第二个问题原因
这个问题是cell复用的时候产生,当我们使用自定义Cell的时候,一般需要的控件都是自定义的时候创建好的,当走数据源方法返回cell的时候我们会将模型数据也同时给Cell.
但是有时候设置数据的时候需要对控件进行特殊处理,这个时候有可能会在重写模型属性的setter方法的时候,直接创建之后添加到self.contentView
上面,当我们的这个Cell在发生复用的时候,走数据源方法再次创建添加这个控件到self.contentView
上,这样导致复用次数越多,添加的越多,如果添加的是整个大图片,还可能导致内存暴涨等原因.解决方式
碰到这种情况,如果是直接添加`self.contentView`上的控件,将控件作为自定义cell的属性,同时实现这个属性控件的懒加载方式,在模型属性的setter方法中直接添加设值即可. 如果是`self.contentView`中某个子控件内部再添加子视图的话,例如要根据数据源来再创建添不同数量的其他子控件,注意判断或者释放这些控件等方式,来避免重复添加..
总结
有些东西经常写,就会不太注意,以为没有问题,实际上放在具体情境中都有可能有问题. 这里只给个涉及到第一个问题的 扩展式布局 的 demo链接
网友评论