将单个容器视图设置为不同的自定义UIViews的好方法?

时间:2017-04-04 11:57:38

标签: ios swift

我有多个不同的自定义UIView类,但它们都使用相同的基本外观,例如取消按钮,标题,圆角,阴影。 我想创建一个包含这些功能的容器,并在其上面添加自定义子视图。

我看到的唯一选项是始终添加该容器,并且每次使用不同的自定义子视图类传递它:

//on container
func setWithView(view:customViewA) { }

但如果我需要将更多参数传递给customA怎么办?并直接从中获取委托?一切都必须通过这个容器(显然是糟糕的设计)

另一种方法是像往常一样添加自定义视图,并在每个内部添加该容器,问题是如果我在上面添加容器,我将不得不在每个自定义子视图上设置圆角和阴影等内容(因为容器在它上面而不在下面而且再次失去效果

我该怎么做?

1 个答案:

答案 0 :(得分:1)

为什么不能使用所有这些控件创建自定义UIView,并为每次使用多次子类化?

这样,所有自定义UIView类都将满足您的需求。

在" initWithFrame"中创建您的子视图方法,当你创建子类时,只需确保调用超类方法,这样每个子类都将创建你想要的控件。

import UIKit

protocol SuperClassProtocol {
func buttonClicked()
}

class SuperClassView: UIView {

var button = UIButton(type: .Custom)
var delegate : SuperClassProtocol?

required init(frame: CGRect) {
    super.init(frame: frame)

    addSubview(button)
    button.addTarget(self, action: #selector(buttonTapped), forControlEvents: .TouchUpInside)
}

func buttonTapped() {

}
}


class SubclassView1 : SuperClassView {

required init(frame: CGRect) {
    super.init(frame: frame) // here it creates the button

    // add here more views
}
}

class SubclassView2 : SuperClassView {

required init(frame: CGRect) {
    super.init(frame: frame) // here it creates the button

    // add here more views
}

override func buttonTapped() {
    self.delegate?.buttonClicked() // call protocol method from subclass
}
}