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

所以我正在实现一个自定义的“select器”工具栏,就像单选button组( UISegmentedControl )的iOS等价物。 只是一个单杠分为选项。

为此,我创build了一个名为SegmentedControlUIControl子类并实现了自定义绘图。 但是,有了这样的观点,我需要select可用的选项。 我可以刚刚从控制器的viewDidLoad()访问视图,并在那里设置,但我喜欢使用界面生成器的那种东西。

所以我发现了这个叫做“用户定义的运行时属性”的美妙的东西。 我创build了一个String属性,并带有一个buttonValues并设置了一个值(这是一个简单的男性/女性select器,所以我select了“Male | Female”)。 我发现你可以使用函数self.valueForKey()来访问这些值并传入密钥。 我做了一个parsing器,将该string转换为数组,然后添加drawRect()函数的function来使用该数组来设置button。

当我运行该应用程序时,出现“关键值编码合规性”错误。

所以我查了一下,发现类必须有支持variables来存储属性。 很好,我添加了一个名为buttonValues的实例variables,并将其初始化为"" 。 现在,应用程序运行良好,但值从self.valueForKey()函数中空出来。 我查阅了关于如何设置用户定义的运行时属性的教程,但是他们没有详细描述。 他们谈论关键的价值编码,就像我应该知道的那样。

我想确切地知道我必须做什么才能正确地工作, 在细节上

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

用户定义的运行时属性

这或多或less像你上面描述的 – 这是最简单的版本:

 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面板

在构build和运行时,控制台将显示该属性设置正确:

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

@IBDesignable&@IBInspectable

这给你的自定义视图在IB中更好的接口 – 在你的类上设置@IBDesignable属性,在每个属性上设置@IBDesignable属性。 这是同一个class级:

 @IBDesignable class LabeledView : UIView { @IBInspectable var viewLabel: String! init(coder aDecoder: NSCoder!) { super.init(coder: aDecoder) } } 

现在,您可以在Interface Builder的“属性”检查器的顶部设置可检查的属性:

属性检查与检查属性