Ios 自定义UIView实现
我有一个名为BaseView的customView,它有一个contentView,在contentView中,我将所有其他子视图(UILabel、UIButton等)添加到override init(frame:CGRect)方法中 现在我有了BaseView的10个子类,它们也重写了init(frame:CGRect)并调用基类init(frame:CGRect)方法 在这里,我的所有子类的UI都与它的BaseView相似,现在有一个子类BaseView不希望在这个基类中包含一些UI元素,但我仍然需要调用superview init(frame:CGRect)。如何在不影响其他类的情况下更改代码Ios 自定义UIView实现,ios,swift,uiview,subclass,Ios,Swift,Uiview,Subclass,我有一个名为BaseView的customView,它有一个contentView,在contentView中,我将所有其他子视图(UILabel、UIButton等)添加到override init(frame:CGRect)方法中 现在我有了BaseView的10个子类,它们也重写了init(frame:CGRect)并调用基类init(frame:CGRect)方法 在这里,我的所有子类的UI都与它的BaseView相似,现在有一个子类BaseView不希望在这个基类中包含一些UI元素,但
Class BaseView: UIView {
let contentView = UIView()
override init(frame: CGRect) {
super.init(frame: frame)
let lbl1 = UILabel()
contentView.addSubView(lbl1)
let lbl2 = UILabel()
contentView.addSubView(lbl2)
self.addSubView(contentView)
}
Class subView1: BaseView {
override init(frame: CGRect) {
super.init(frame: frame)
// This class will show lbl1, lbl2 and lbl3 in the contentview
let lbl3 = UILabel()
contentView.addSubView(lbl3) // this contentview is BaseView's ContentView
}
// Similarly I have around 10 Subclasses of BaseView which is adding some UI Element to
baseview's contentView
// Question here is, below I am going to create another subclass of BaseView, But I don't
want to show lbl1 and lbl2 which is created in my BaseView's contentview
Class myView: BaseView {
// this class should not show the base class uilement lbl1 and lbl2, It should show only
lbl4 which is created by this class only
override init(frame: CGRect) {
super.init(frame: frame)
let lbl4 = UILabel()
contentView.addSubView(lbl4) // this contentview is BaseView's ContentView
}
如何在不影响其他类的情况下更改代码
你没有。需要一种不同的方法。三种选择是:
- 不要从
派生有问题的视图,只需复制所需的BaseView
功能即可BaseView
- 继续从
派生,并在BaseView
的初始化方法之后隐藏或删除不需要的元素。此计划的成功与否取决于当预期的元素丢失时,BaseView
的容忍度BaseView
- 将
中的功能重构到一个新类中,该类的行为与所有视图相同,并使一个异常视图和BaseView
都从该新类派生BaseView
- 不要从
派生有问题的视图,只需复制所需的BaseView
功能即可BaseView
- 继续从
派生,并在BaseView
的初始化方法之后隐藏或删除不需要的元素。此计划的成功与否取决于当预期的元素丢失时,BaseView
的容忍度BaseView
- 将
中的功能重构到一个新类中,该类的行为与所有视图相同,并使一个异常视图和BaseView
都从该新类派生BaseView
- 以下是实现所需功能的不同方法
创建一个具有内容视图的父类,在其中显示内容
class SuperView: UIView {
let contentView = UIView()
override init(frame: CGRect) {
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
}
从SuperView类继承BaseView类,并且可以从BaseView类继承其他类
class BaseView: SuperView {
override init(frame: CGRect) {
super.init(frame: .zero)
contentView.addSubview(UILabel()) // UILabel 1
contentView.addSubview(UILabel()) // UILabel 2
self.addSubview(contentView)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
class SubView: SuperView {
override init(frame: CGRect) {
super.init(frame: .zero)
contentView.addSubview(UILabel()) // UILabel 3
self.addSubview(contentView)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
}
从SuperView类继承子视图类,以添加所需的不同属性和函数。在这里,您不需要从BaseView类继承
class BaseView: SuperView {
override init(frame: CGRect) {
super.init(frame: .zero)
contentView.addSubview(UILabel()) // UILabel 1
contentView.addSubview(UILabel()) // UILabel 2
self.addSubview(contentView)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
class SubView: SuperView {
override init(frame: CGRect) {
super.init(frame: .zero)
contentView.addSubview(UILabel()) // UILabel 3
self.addSubview(contentView)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
}
我希望它能帮助您实现所需的功能。以下是实现所需功能的不同方法 创建一个具有内容视图的父类,在其中显示内容
class SuperView: UIView {
let contentView = UIView()
override init(frame: CGRect) {
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
}
从SuperView类继承BaseView类,并且可以从BaseView类继承其他类
class BaseView: SuperView {
override init(frame: CGRect) {
super.init(frame: .zero)
contentView.addSubview(UILabel()) // UILabel 1
contentView.addSubview(UILabel()) // UILabel 2
self.addSubview(contentView)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
class SubView: SuperView {
override init(frame: CGRect) {
super.init(frame: .zero)
contentView.addSubview(UILabel()) // UILabel 3
self.addSubview(contentView)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
}
从SuperView类继承子视图类,以添加所需的不同属性和函数。在这里,您不需要从BaseView类继承
class BaseView: SuperView {
override init(frame: CGRect) {
super.init(frame: .zero)
contentView.addSubview(UILabel()) // UILabel 1
contentView.addSubview(UILabel()) // UILabel 2
self.addSubview(contentView)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
class SubView: SuperView {
override init(frame: CGRect) {
super.init(frame: .zero)
contentView.addSubview(UILabel()) // UILabel 3
self.addSubview(contentView)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
fatalError("init(coder:) has not been implemented")
}
}
我希望它能帮助您实现所需的功能