自定义控件的Lazy UILabel属性

时间:2017-09-14 12:45:20

标签: ios swift custom-controls lazy-initialization

我希望能够在界面构建器中设置自定义控件的标题,并将标题实现为UILabel。我创建了我的属性:

@IBInspectable var titleText: String? {
    get {
        return title.text
    }
    set(newTitleText) {
        title.text = newTitleText
    }
}
@IBInspectable lazy var title: UILabel = UILabel.init()

这是一个很好/推荐的方法吗?如果标题文本已经设置并且计划通过覆盖layoutSubviews来计划执行此操作,我还希望控件布局UILabel - 这是推荐的还是你会建议不同的模式吗?

我的最终目标是能够让设计师从IB配置我的控件,并将UILabel暴露为可以在IB中配置的属性,这将是我的理想。

2 个答案:

答案 0 :(得分:1)

@IBInspectable只能用于以下类型:

Int
CGFloat
Double
String
Bool
CGPoint
CGSize
CGRect
UIColor
UIImage

所以,不,你不能“暴露UILabel”进行设计时操作。

答案 1 :(得分:1)

首先,我认为你不需要在这里创建变量lazy,如果你想创建一个新的UILabel实例,最好使用构造函数UILabel()。 / p>

现在,我不确定我是否正确理解了您的问题,但如果我这样做了,那么您可以将自定义视图属性(例如代表您的标题标签的字符串)公开给属性检查员。

你会这样做:

@IBDesignable
class CustomView: UIView {

    @IBOutlet weak var titleLabel: UILabel!

    @IBInspectable var title: String? {
        didSet { self.titleLabel.text = title }
    }

}

打破上面的代码:

首先,您创建类(自定义视图)@IBDesignable,以便它支持Interface Builder中的实时预览。 然后,在自定义视图类中,创建一个title属性(String),并确保将其设为@IBInspectable,以便稍后可以通过Attributes Inspector更改此属性。 最后,添加属性观察器(didSet),以便每当从Attributes Inspector更改title属性时,都会更新自定义标签的text属性。