在日常开发中,我们常常会用到,懒加载,但是懒加载的创建方式使里面的属性往往是固定不变的。假如我们想改变懒加载中的属性值,就会有点麻烦。
使用场景
今天在开发中遇到一个问题,TableView 需要添加一个 footView,代码中footview是通过懒加载出来的。一经创建,里面的样式是不可变的。但是需求中footview 并不是固定不变的,是需要根据数据的变化显示不同的footview 的显示形态。
根据这种场景,我想了两个解决方案:
- 比较无脑的解决的方式(不建议)
就是根据不同的状态值,创建多种不同的footview。这样代码必定会比较冗余。不建议这样做,维护和代码阅读比较耗时间,以后假如需要修改,需要同时改很多套代码,增加工作量,不是很建议这种方法。
- 使用自定义封装类,懒加载创建(推荐)
回到使用场景中,做场景解析,比如:我们日常的 footView 一般都会这么做。
var footerView: UIView = {
let head = UIVIew(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 35))
showMoreBtn = UIButton(frame: CGRect(x: 20, y: 0, width: kScreenWidth - 40, height: 25))
showMoreBtn.setTitleColor(.lightGray), for: .normal)
showMoreBtn.titleLabel?.textAlignment = .center
showMoreBtn.titleLabel?.text = "这是一个footView"
showMoreBtn.addTarget(self, action: #selector(showMoreBtnClickAction), for: .touchUpInside)
addSubview(head.showMoreBtn)
return head
}()
假如我们想根据tableView中的数据数量,制定不同文字的显示,就会显着有点棘手。
假如我们把 footerView 封装为一个带有text属性的View 在需要改变文字内容的时候,直接赋值改变footView.text属性,这样就会一套footview布局代码,显示多种样式。就会方便了很多 比如:
我们需要做的首先根据footView复杂程度,考虑要不要新建一个类页面来自定义这个footView,这里我的需求只是改变文本提示所以,没有必要新建一个页面,我就直接在当前页面下面,新建了一个 cusFootView 类来添加属性:
//MARK: 组尾视图添私有制属性
class cusFootView: UIView{
var showMoreBtn = UIButton()
var showType: Int? {
didSet{
if let num = showType {
if num == 0 {
viewTitle = "暂无数据"
}else if num <= 10{
//tableview一页显示10条数据,当一页不到十条数据时,显示 已经加载全部 提示
viewTitle = "已全部加载"
}else{
viewTitle = "点击查看全部"
}
}
}
}
var viewTitle: String?{
willSet {
showMoreBtn.setTitle(viewTitle, for: .normal)
}
}
}
这里我是在这个cusFootView中 添加了 showMoreBtn,showType,viewTitle三个属性,showMoreBtn会根据列表数量上的变化自动更新文本提示。
lazy var footerView: cusFootView = {
let head = proFootView(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 35))
head.showMoreBtn = UIButton(frame: CGRect(x: 20, y: 0, width: kScreenWidth - 40, height: 25))
head.showMoreBtn.setTitleColor(UIColor.RGBA(hex: "#E8E8E9"), for: .normal)
head.showMoreBtn.titleLabel?.textAlignment = .center
head.showMoreBtn.addTarget(self, action: #selector(showMoreBtnClickAction), for: .touchUpInside)
head.addSubview(head.showMoreBtn)
return head
}()
以后想显示不同状态的时候只需要改变footerView.showType这个数量,footview就会根据你设定的状态显示不同形态,这种方法比第一种方便了很多,后期也易维护,阅读
footerView.showType = list.count
这里就是footView自定义封装创建了,可以动态根据数据的变化,改变里面属性的显示值。
场景延伸
同样,我们在用到懒加载的场景中,有类似的需求,就可以直接封装一个我们自定义的类,来添加我们需要的扩展属性,并且在属性赋值willSet,didSet时,做一些我们自己的逻辑代码,就可以做到,懒加载中的属性值动态改变了。
结尾
这就是今天我想要跟大家分享的一个懒加载动态赋值解决方案,如有你有不同看法欢迎评论留言,毕竟我是一个swift 小白,大家一起深入交流,进步~ 哈哈哈。
大家多和热水~早点休息
网友评论