因此,我实现了一个自定义的“选择器”工具栏,就像iOS中的单选按钮集(UISegmentedControl
)等效。只是将水平杠分成选项。
为此,我创建了UIControl
的子类SegmentedControl
并实现了自定义绘图。但是,从这样的观点来看,我需要选项来设置可用的选项。我本来可以从 Controller 的viewDidLoad()
访问 View 并将其设置在那里,但是我喜欢使用接口(interface)构建器来处理这种事情。
因此,我发现了这个奇妙的东西,叫做“用户定义的运行时属性”。我使用键String
创建了buttonValues
属性并设置了一个值(这是一个简单的Male/Female选择器,因此我选择了“Male | Female”)。我发现您可以使用函数self.valueForKey()
访问这些值并传递 key 。我做了一个解析器,将该字符串转换为数组,然后为drawRect()
函数添加了使用该数组来设置按钮的功能。
当我运行该应用程序时,出现关于“键值编码合规性”的错误。
因此,我进行了查找,发现该类必须具有后备变量来存储属性。很好,我添加了一个名为buttonValues
的实例变量,并将其初始化为""
。现在,该应用程序可以正常运行,但self.valueForKey()
函数的值变为空。我查阅了有关如何设置用户定义的运行时属性的教程,但它们没有足够详细。他们谈论键值编码合规性,就像我应该知道的那样。
我想确切地知道如何才能正常工作,这非常详细。
最佳答案
为了您的目的,您可以使用用户定义的运行时属性,也可以在Interface Builder中将您的类和属性公开为可编辑。无论哪种方式,您都需要将属性声明为隐式解包的可选变量-IBOutlets
的创建方式相同。如果您的属性具有值后需要进行其他更改,请为他们提供didSet
属性观察者。这些属性将在初始化期间为默认值(如果未设置默认值,则为nil
),并在将 View 添加到 super View 时设置。
用户定义的运行时属性
这或多或少像您上面描述的那样工作-这是最简单的版本:
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)")
}
}
然后在 Storyboard 中将 View 的
viewLabel
属性设置为“Hello”,如下所示:在构建和运行时,控制台将显示属性设置正确:
init with coder, viewLabel = nil
didSet viewLabel, viewLabel = Hello
@IBDesignable和@IBInspectable
这使您的自定义 View 在IB中具有更好的界面-在类上设置
@IBDesignable
属性,在每个属性上设置@IBInspectable
属性。这是同一个类:@IBDesignable class LabeledView : UIView {
@IBInspectable var viewLabel: String!
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder)
}
}
现在,您可以在Interface Builder中的“属性”检查器的顶部设置可检查的属性:
关于ios - Swift:如何实现用户定义的运行时属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24425324/