博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios cell 控件状态被重用,教你三步跳出坑(cell里面控件状态版)
阅读量:6092 次
发布时间:2019-06-20

本文共 1087 字,大约阅读时间需要 3 分钟。

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

转载于:https://juejin.im/post/5a3217b9f265da43070348f1

你可能感兴趣的文章
全局探色器
查看>>
Hive Export和Import介绍及操作示例
查看>>
http://mongoexplorer.com/ 一个不错的 mongodb 客户端工具。。。
查看>>
上传jar包到nexus私服
查看>>
Why Namespace? - 每天5分钟玩转 OpenStack(102)
查看>>
Project:如何分析项目中的资源分配情况
查看>>
HDU 4803 Poor Warehouse Keeper (贪心+避开精度)
查看>>
小错误汇总
查看>>
Spring源码系列 — Envoriment组件
查看>>
java正则表达式去除html标签,Java中正则表达式去除html标签
查看>>
使用Cobbler批量部署Linux操作系统
查看>>
zabbix企业应用之服务端与客户端的安装
查看>>
实例讲解遗传算法——基于遗传算法的自动组卷系统【理论篇】
查看>>
无法在web服务器上启动调试。调试失败,因为没有启用集成windows身份验证
查看>>
Bat相关的项目应用
查看>>
Django为数据库的ORM写测试例(TestCase)
查看>>
NYOJ-107 A Famous ICPC Team
查看>>
与众不同 windows phone (44) - 8.0 位置和地图
查看>>
Visual Studio Code 使用 ESLint 增强代码风格检查
查看>>
iOS设备中的推送(二):证书
查看>>