Swift:如何实现用户定义的运行时属性
所以我正在实现一个自定义的“select器”工具栏,就像单选button组( UISegmentedControl
)的iOS等价物。 只是一个单杠分为选项。
为此,我创build了一个名为SegmentedControl
的UIControl
子类并实现了自定义绘图。 但是,有了这样的观点,我需要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”,如下所示:
在构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的“属性”检查器的顶部设置可检查的属性: