10

我有一个正在创建的 call 子UIViewMyView

其中有一个UILabel(由于原因,这是在代码中而不是在 InterfaceBuilder 中添加的)。

MyView然后我有一个叫做的属性color

我想要的是让 Interface Builder 能够选择color并显示带有设置为该颜色的字体的标签。

在我的代码中,我...

@IBDesignable class MyView: UIView {

    private let textLabel = UILabel()

    @IBInspectable var color: UIColor = .blackColor() {
        didSet {
            textLabel.textColor = color
        }
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        initialSetup()
    }

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

       initialSetup()
    }

    private func initialSetup() -> Void {
        self.backgroundColor = .clearColor()

        textLabel.textAlignment = .Center
        textLabel.numberOfLines = 0

        addSubview(textLabel)
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        textLabel.frame = bounds
    }

    // I have no idea what I'm doing here?!
    override func prepareForInterfaceBuilder() {
        // should I create a label specifically for here?
        // or should I use the property textLabel?

        textLabel.text = "Hello, world!" // setting place holder IB text?
        textLabel.textColor = color
        textLabel.font = .systemFontOfSize(21)
        textLabel.textAlignment = .Center
        textLabel.numberOfLines = 0

        // do I need to add sub view?
    }

}

IBInspectable

在 IB 中,我可以在那里看到颜色属性并且可以设置它。令人讨厌的是,它采用默认值 .clearColor() 虽然不是我在代码中设置的颜色。有没有办法解决这个问题?

IB可设计

当我将视图放入 InterfaceBuilder 时,它会显示所有可检查的属性,但实际视图中没有显示任何内容。

当我运行它时,一切正常。我只是希望能够在 IB 中得到一些工作(除了 drawRect)。不过,我发现明显缺乏文档。

编辑 - 警告

我刚刚注意到我收到构建错误/警告说......

警告:IB Designables:忽略“UIView”实例上关键路径“颜色”的用户定义运行时属性。尝试设置其值时遇到异常:[ setValue:forUndefinedKey:]:此类不符合键颜色的键值编码。

这可能会改变解决方案:)

4

3 回答 3

2

我将您问题中的代码复制到一个新应用程序中,添加了视图并设置了属性,它工作得很好。

您看到的错误表明您在某些时候已将视图更改回身份检查器中的普通 UIView(在这种情况下,用户定义的属性仍然存在)。

在此处输入图像描述

于 2015-01-22T12:41:13.343 回答
1

设置颜色后,您需要使用 didSet 更新 textLabel 属性,如下所示

@IBInspectable var color: UIColor = UIColor.blackColor() {
    didSet {
        textLabel.textColor = color
    }
}
于 2015-01-22T12:16:32.860 回答
1

我正在使用 swift 2.0,在我的情况下缺少动态属性。最终代码:

@IBInspectable dynamic var radius:CGFloat = 2.0 {
    didSet {
     //   setNeedsDisplay()
        layer.cornerRadius = radius

    }
}

在构建IB Designables期间找出错误: http : //lamb-mei.com/537/xcode-ibdesignables-ignoring-user-defined-runtime-attribute-for-key-path-bordercolor-on-instance-of-uiview -this-class-is-not-key-value-coding-compliant-for-the-key-bordercolor/

于 2015-11-13T07:41:45.227 回答