Ios 自定义UIView实现

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元素,但

我有一个名为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)。如何在不影响其他类的情况下更改代码

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")
      }
      
      }

      我希望它能帮助您实现所需的功能