做项目的时候,同事遇到了类似的问题,选中一行时候,cell的重用会会把之前的cell的控件状态拿来重用,于是翻出之前的笔记,供大家参考。
问题,cell的重用,导致cell里面的控件状态如果被改变,随之影响的可能是第(N)行的Cell也可能会跟着被改变;
栗子:如果有一个歌曲下载列表,有一个下载按钮,点击下载按钮后,按钮显示已下载,并且修改其为不可点击状态;
如图
假设,我们已经遵循MVC设计来实现代码,则代码的修改则极其少,就可避免cell的控件状态被复用。
关于用cell的两点建议:
1.注意cell对应的数据
2.注意cell的控件状态
原理分析:由于cell的重用机制,会从缓存池里面取出以前的cell,因此,也会取出相对应的 cell数据和cell控件的状态,因此cell的重用机制会造成数据错乱和cell控件状态莫名被影响两大问题;
cell数据在另一篇,这主要是解决控件状态问题。
解决原理很简单,给数据模型添加一个相对应得属性,在需要修改的方法里面赋值,再在设置数据方法中判断是否该属性是否为YES,或者相对应得枚举,由在此确定状态应该如何显示。
1.给数据模型添加一个属性:(注意,不一定按照这个格式,要根据实际情况来,如果同一个控件需要几个状态,那明显用枚举。)
/**
- 用于判断控件状态
*/
@property (nonatomic,assign,getter=isDownloaded)BOOL downloaded;
2.在需要修改控件的方法中修改你的控件,并将 给用于控制控件状态的属性赋值;
self.song.downloaded=YES; //这是数据模型的属性
self.btndownload.enabled=NO; //这是需要修改控件的状态
3.在设置数据中判断数据中的 downloaded 属性是否被修改,并且设置对应控件的状态;
self.btnDown.enabled=self.song.isDownloaded==NO;
在整个过程中,始终都没对控制器做任何修改,只是改了数据模型和相对应的 cell 。
三步搞定。之前看到有人给每一个控件添加 tag,再通过 tag 来判断按钮是否创建,有多少条数据就添加多少个控件,这样完全体现不出cell重用,白白浪费了苹果公司的一番心意了。
这只是一个思路,通过改数据源的属性状态来改cell的控件状态。如果有其他想法欢迎评论交流。
网友评论
365858597@qq.com
self.btnDown.enabled : 按钮的可点击状态
song.isDownloaded :获得歌曲下载状态
no :按钮不可点
mark:现在不做ios 开发了,最近在做企业 ERP 。凭记忆敲的
605519902@qq.com