Ios 如何使用IBInspectable控制子视图的属性?
我正在编写一个自定义视图,其中有两个标签作为子视图-Ios 如何使用IBInspectable控制子视图的属性?,ios,swift,uiview,Ios,Swift,Uiview,我正在编写一个自定义视图,其中有两个标签作为子视图-titleLabel和subtitleLabel 我添加了两个名为titleText和subtitleText的@IBInspectable属性,这样我就可以很容易地在情节提要中设置标签的文本 class MyView : UIView { var titleLabel: UILabel! var subtitleLabel: UILabel! @IBInspectable var titleText: Str
titleLabel
和subtitleLabel
我添加了两个名为titleText
和subtitleText
的@IBInspectable
属性,这样我就可以很容易地在情节提要中设置标签的文本
class MyView : UIView {
var titleLabel: UILabel!
var subtitleLabel: UILabel!
@IBInspectable
var titleText: String? {
get { return titleLabel.text }
set {
titleLabel.text = newValue
let fontSize = // calculates appropriate font size for the text...
titleLabel.font = font.withSize(fontSize)
}
}
@IBInspectable
var subtitleText: String? {
get { return subtitleLabel.text }
set {
subtitleLabel.text = newValue
let fontSize = // calculates appropriate font size for the text...
subtitleLabel.font = font.withSize(fontSize)
}
}
override func draw(_ rect: CGRect) {
// here I make the view look prettier, irrelevant to the question
}
}
现在我需要初始化这两个标签,并将它们添加为MyView
的子视图。我想我可以在awakeFromNib
中这样做:
override func awakeFromNib() {
titleLabel = UILabel(frame: CGRect(
x: ...,
y: ...,
width: ...,
height: ...))
self.addSubview(titleLabel)
subtitleLabel = UILabel(frame: CGRect(
x: ...,
y: ...,
width: ...,
height: ...))
self.addSubview(subtitleLabel)
}
因此,我在故事板中添加了一个MyView
,并使用属性检查器设置了它的属性,然后运行了这个应用程序。它坠毁了
显然,IBInspectable
属性是在awakeFromNib
之前设置的,因此此时标签尚未初始化
这意味着我需要在设置IBInspectable
属性之前调用的方法中初始化标签
在设置可以重写以初始化子视图的
IBInspectable
属性之前调用的方法是什么?这可能很明显,但将这些内容放入的正确方法是初始化器
此外,在您的具体情况下,没有真正的理由选择期权:
let titleLabel: UILabel = UILabel()
您可以将标签添加为子视图,并在以后更新框架。成功了!我一直认为我需要在
init(来自aDecoder)
中初始化我的属性!这就是为什么我从未想过使用init
。
let titleLabel: UILabel = UILabel()