自定义控件的懒惰UILabel属性

问题描述:

我希望能够在界面构建器中设置我的自定义控件的标题并将标题实现为UILabel。我创建了我的属性,因此:自定义控件的懒惰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中配置的属性公开,这将是我的理想选择。

+1

你为什么认为'title'懒惰地声明有帮助?我看不出为什么你会声明一个'UILabel'是可选的。此外,不要直接使用'init()'调用初始化器,使用简写符号'UILabel()'。 –

+0

谢谢大卫。正如你可以看到我是Swift新手(请放松一下)。之所以我懒惰地初始化,是因为用户(或设计者)不会设置标题的次数很多,所以只有在实际需要显示某些标题文本时才想创建一个标题。同样想要忽略标题的布局,如果UILabel为零。 –

@IBInspectable只能与下列类型可以使用:

Int 
CGFloat 
Double 
String 
Bool 
CGPoint 
CGSize 
CGRect 
UIColor 
UIImage 

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

首先,我认为您不需要在此处创建变量lazy,而且,如果要创建UILabel的新实例,最好使用构造函数UILabel()。现在

,我不知道如果我理解正确的话你的问题,但如果我这样做,那么你就可以暴露自定义视图属性在属性检查器(代表例如你的标题标签的字符串)。

你会做它像这样:

@IBDesignable 
class CustomView: UIView { 

    @IBOutlet weak var titleLabel: UILabel! 

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

} 

分手的时候上面的代码:

首先你要的类(自定义视图)@IBDesignable,使其支持Interface Builder的实时预览。 然后,在您的自定义视图类中,创建一个标题属性(这是一个String)并确保将其设置为@IBInspectable,以便稍后可以通过属性检查器更改此属性。 最后,您将添加一个属性观察器(didSet),以便在您从属性检查器更改标题属性时更新自定义标签的文本属性。

+0

谢谢亚历克斯。我有IBDesignable类和IBInspectable字符串属性。如果可能的话,我希望控件完全自包含,因此在IB中没有添加子视图的销售点,但允许尽可能多地在代码或IB中进行自定义。那有意义吗?这是一个图形组件,所以标题是最明显的例子。图表可能有也可能没有标题,从我读过的内容来看,最好的做法是公开一个标签,以便定制与OS的其余部分保持一致。我来自ObjC背景,所以这是一个新的。干杯戴夫。 –