美文网首页iOSios积累iOS Developer
ios cell 控件状态被重用,教你三步跳出坑(cell里面控

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

作者: 幺加幺 | 来源:发表于2016-09-23 14:52 被阅读1905次

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

相关文章

网友评论

  • 5斤8两:求demo大神!!我这个问题纠结了好久
    365858597@qq.com
  • 夜生物:大神有demo吗?我不知道怎么改
  • SkyMing一C:第三步“在设置数据中判断数据中的 downloaded 属性是否被修改,并且设置对应控件的状态”不是很懂,能给小弟解释一下吗大神
    SkyMing一C:明白了,谢谢
    幺加幺:@我要你好好的哦 @绪雨成澜 如果有哪些地发说的不对欢迎指出 :smile:
    幺加幺:@我要你好好的哦 @绪雨成澜 看前面的 getter=isDownloaded,设置get方法,
    self.btnDown.enabled : 按钮的可点击状态
    song.isDownloaded :获得歌曲下载状态
    no :按钮不可点
    mark:现在不做ios 开发了,最近在做企业 ERP 。凭记忆敲的
  • 绪雨成澜:第三步“在设置数据中判断数据中的 downloaded 属性是否被修改,并且设置对应控件的状态”不是很懂,能给小弟解释一下吗大神?
  • iOS小学生:cell重用
  • 人工智能VC生物智能:就是cell上有label的话,label的大小值要根据数据自适应,这个怎么搞
    幺加幺:@人工智能VC生物智能 数据超过几行的话,建议在模型再套一层用于计算cell的高度,动态加载cell的同时把cell的高度也计算出来,数据不多直接label自适应就行了
  • 超_iOS:每次加载cell控件时吧那个状态控件= nil,让他重新加载,大神觉得怎么样?
    幺加幺:@iOS_超 不错的想法,可以实践试一下,所有东西都是实践出来的,不过貌似有问题
  • mr_zNm:思路接受了。大叔以后多写写这些思路,给我一种恍然大悟的感觉
    mr_zNm:@绪雨成澜 好久才来登这个号。这个是运算,self.song.isDownloaded==NO 这是个判断,将运算结果赋值给self.btnDown.enabled。这俩都是按钮状态
    绪雨成澜:@mr_zNm 你好,他这里面第三步,在复写数据的set方法里面进行的是什么操作呀?我没怎么懂,请指点一下 :fearful:
  • 幺加幺:图中项目是一年前无聊自己弄来玩的,由于时间有点久了,源码找不到了。现在的项目因为属于公司财产,原谅大叔不能贡献出来哈 :smile: 。这里cell传数据模型,有一点要记住重写set方法。可以通过set方法里面调整控制控件的状态。@浅忆微凉iOS @我要有腹肌了 @JopYin @十一岁的加重
    我要有腹肌了:@幺叔 谢谢:+1:
  • d83b1a9a55db:大叔,求demo。1045007069@qq.com
  • 十一岁的加重:看来是想要别人图里的项目
  • 我要有腹肌了:447999839@qq.com我的邮箱 谢谢了
  • 我要有腹肌了:同求demo 我就是你说的用tag:joy::joy::joy:
  • JopYin:大叔有代码吗?能否发一份给我
    605519902@qq.com

本文标题:ios cell 控件状态被重用,教你三步跳出坑(cell里面控

本文链接:https://www.haomeiwen.com/subject/fjmtyttx.html