做项目的时候,同事遇到了类似的问题,选中一行时候,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的控件状态。如果有其他想法欢迎评论交流。