需要BaseView吗?
-
Controller是需要一个Base的,能做很多事情,比如导航栏的显示隐藏,点击收键盘等等
-
View还真找不到什么公共的功能;(以后埋点有可能遇到);从这个角度来说,提供一个空的BaseView还真没什么用
-
UIView的初始化真的很麻烦,把这些垃圾代码固定在一个地方,形成一个固定格式,这倒是稍微有点用。
从这个角度出发,就考虑提供一个空的BaseView;谁知道以后会不会有公共的内容呢,先留一个可供修改的位置再说。
初始化
-
init(frme: CGRect): 代码初始化时调用。
-
init(coder: NSCoder): xib 或者 stroryboard 加载时调用。
-
说实话,这种设计很不合理。既然我用xib或者stroryboard了,写什么初始化函数,直接在stroryboard指定就好了。并且这个init(coder: NSCoder)是必须实现的,形成无效的废代码。
-
为了隔绝这些恶心的代码,就可以考虑提供一个空的BaseView,恶心的init只写一次就够了。
设置尺寸
-
不论是设置frame,还是添加autolayout约束,在init中做都是不合适的。因为这个时候,尺寸还没确定
-
UIViewController倒是提供了合适的位置,但是UIView却没有合适的位置
-
一个相对可行的地方是layouSubviews(),至少在这里,尺寸什么的都已经确定了。至于多次执行,问题不大,同一个限制添加多次,还是只有一个
-
updateConstraints()这个方法不要碰,一点作用没有,风险很大。autolayout的约束,千万不要更新,只做添加
大概的样子
/// View的基类,现在暂时不知道放什么,先占个位置
class BaseView: UIView {
// MARK: - Lifecycle
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
setupConstraints()
}
// MARK: - Public
// MARK: - Protocol
// MARK: - IBActions
// MARK: - Private
// MARK: - UI
/// 创建视图统一写在这里
func setupUI() {}
// MARK: - Constraints
/// 添加限制统一写在这里
func setupConstraints() {}
}
使用的地方
可以不用管初始化的地方了
class LineView: BaseView {
// MARK: - Public
// MARK: - Protocol
// MARK: - IBActions
// MARK: - Private
// MARK: - UI
override func setupUI() {
super.setupUI()
self.backgroundColor = UIColor.hexColor(0xFFF2F2F2)
}
// MARK: - Constraints
override func setupConstraints() {
super.setupConstraints()
/// 高度0.5
self.snp.makeConstraints { make in
make.height.equalTo(0.5)
}
}
// MARK: - Property
}
自定义初始化
不要有这种想法就好。
先创建View,然后提供函数来更新就好。
参考文章
swift UIView 构造函数
swift 自定义UIView构造函数
纠结后的选择
继承,重写,在Swift中并不好用
纠结之后,还是决定删除BaseView
固定结构之后,省不了多少,但是麻烦不少。比如要额外设置属性该怎么办?
网友评论