Пользовательская реализация UIView - PullRequest
0 голосов
/ 16 июня 2020

У меня есть customView с именем BaseView, у которого есть contentView. В contentView я добавляю все другие подпредставления (UILabel, UIButton и др. c) в метод переопределения init (frame: CGRect).

Теперь у меня есть 10 подклассов моего BaseView, которые также переопределяют init (frame: CGRect) и вызывают метод init (frame: CGRect) базового класса.

Здесь все мои подклассы выглядят как пользовательский интерфейс его BaseView. Теперь есть один подкласс BaseView, которому не нужны некоторые элементы пользовательского интерфейса в этом базовом классе, но мне все равно нужно вызвать 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


     }

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Вот другой подход к реализации требуемой функциональности.

Создайте родительский класс с представлением содержимого, в котором вы хотите отображать содержимое.

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

}

Наследуйте класс BaseView от класса 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")
}

}

Наследовать класс SubView от класса SuperView, чтобы добавить различные свойства и функции, которые вы хотите. Здесь вам не нужно наследовать от класса BaseView.

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

}

Надеюсь, это поможет вам реализовать требуемую функциональность по своему усмотрению.

0 голосов
/ 16 июня 2020

Как мне изменить код, не затрагивая другие классы?

Вы этого не делаете. Нужен другой подход. Три варианта:

  • Не выводите рассматриваемое представление из BaseView, а просто воспроизводите все BaseView функциональные возможности, которые вам нужны.
  • Продолжайте наследовать от BaseView , и скройте или удалите ненужные элементы после метода инициализации BaseView. Успех этого плана будет зависеть от того, насколько терпимым будет BaseView, когда элементы, которые он ожидает, отсутствуют.
  • Реорганизуйте функциональность в BaseView в некоторый новый класс, который имеет поведение, общее для всех ваших представлений, и ваше одно исключительное представление и BaseView каждое происходит от этого нового класса.
...