Swift:如何实现用户定义的运行时属性

时间:2014-06-26 08:01:11

标签: ios xcode swift

所以我正在实施一个自定义"选择器"工具栏,就像iOS等效的单选按钮集(UISegmentedControl)。只是一个水平栏分为选项。

为此,我创建了一个名为UIControl的{​​{1}}子类,并实现了自定义绘图。但是,有了这样的视图,我需要选项来设置可用的选项。我本来可以从控制器的SegmentedControl访问该视图并在那里设置它们,但我喜欢使用界面构建器来处理那种东西。

所以我发现了这个名为"用户定义的运行时属性的奇妙事物。"我使用键viewDidLoad()创建了一个String属性并设置了一个值(这是一个简单的男/女选择器,因此我选择了"男|女")。我发现您可以使用函数buttonValues访问这些值并传入密钥。我创建了一个解析器,将该字符串转换为数组,然后添加了self.valueForKey()函数的功能,以使用该数组来设置按钮。

当我运行该应用时,我收到了关于"键值编码合规性的错误。"

所以我查了一下,我发现该类必须有支持变量来存储属性。很好,我添加了一个名为drawRect()的实例变量,并将其初始化为buttonValues。现在应用程序运行正常但是""函数的值是空的。我查阅了有关如何设置用户定义的运行时属性的教程,但他们没有详细介绍。他们谈论的是Key Value Coding-compliance,就像我应该知道的那样。

我想确切地知道我必须做些什么才能使其正常工作,以详细信息

1 个答案:

答案 0 :(得分:19)

出于您的目的,您可以使用用户定义的运行时属性,或者在Interface Builder中将您的类和属性公开为可编辑。无论哪种方式,您都希望将您的属性声明为隐式解包可选变量 - IBOutlets以相同的方式创建。如果您需要在属性具有值后进行其他更改,请为其提供didSet属性观察者。初始化期间属性将保持默认值(如果未设置默认值,则为nil),并在视图添加到超级视图时设置。

用户定义的运行时属性

这或多或少与您上面描述的一样 - 这是最简单的版本:

class LabeledView : UIView {
    var viewLabel: String! {
    didSet {
        println("didSet viewLabel, viewLabel = \(self.viewLabel)")
    }
    }

    init(coder aDecoder: NSCoder!)  {
        super.init(coder: aDecoder)
        println("init with coder, viewLabel = \(self.viewLabel)")
    }
}

然后将viewLabel属性设置为" Hello"在故事板中的视图上,如下所示:

Xcode panel showing user-defined runtime attributes

当你建立&运行,控制台将显示正确设置属性:

init with coder, viewLabel = nil
didSet viewLabel, viewLabel = Hello

@IBDesignable& @IBInspectable

这为您的自定义视图提供了更好的IB界面 - 在您的类上设置@IBDesignable属性,在每个属性上设置@IBInspectable属性。这是同一个班级:

@IBDesignable class LabeledView : UIView {
    @IBInspectable var viewLabel: String!

    init(coder aDecoder: NSCoder!)  {
        super.init(coder: aDecoder)
    }
}

现在,您可以在Interface Builder中的Attributes Inspector顶部设置可检查属性:

Attributes Inspector with inspectable property