ios cell 控件状态被重用,教你三步跳出坑(cell里面控件状态版)

​做项目的时候,同事遇到了类似的问题,选中一行时候,cell的重用会会把之前的cell的控件状态拿来重用,于是翻出之前的笔记,供大家参考。
问题,cell的重用,导致cell里面的控件状态如果被改变,随之影响的可能是第(N)行的Cell也可能会跟着被改变;

栗子:如果有一个歌曲下载列表,有一个下载按钮,点击下载按钮后,按钮显示已下载,并且修改其为不可点击状态;
如图

音乐.png

假设,我们已经遵循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的控件状态。如果有其他想法欢迎评论交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值