在 Swift 中实现变量属性 属性 观察者
Implement variable attribute property observer in Swift
我想在 "sub-attribute" 变量上实现 didSet
。
示例:
@IBOutlet weak var myLabel: UILabel!
var myLabel.hidden { didSet{ "DO SOMETHING" } }
我想在 myLabel.hidden
属性更改时 hide/show 一些其他视图。
我该怎么做?
属性 观察者只能添加到 class,不能添加到实例。为了做到这一点,你需要 subclass UILabel
然后覆盖 hidden
的 属性 观察者。
编辑:如果您想在 CustomLabel 的实例上设置自定义观察者,您可以通过将块函数变量添加到在 didSet
或 willSet
[=15= 上触发的 CustomLabel 来轻松实现]
class CustomLabel: UILabel {
var onDidSetHidden: ((Bool) -> ())?
var onWillSetHidden: ((Bool) -> ())?
override var hidden: Bool {
didSet {
if let block = onDidSetHidden {
block(self.hidden)
}
}
willSet (willBeHidden) {
if let block = onWillSetHidden {
block(willBeHidden)
}
}
}
}
var custom = CustomLabel()
custom.onDidSetHidden = { (isHidden) in
if isHidden {
println("IS HIDDEN")
} else {
println("IS NOT HIDDEN")
}
}
custom.hidden = true //prints 'IS HIDDEN'
标准流程是使用KVO。加载视图时添加观察者:
override func viewDidLoad() {
super.viewDidLoad()
label.addObserver(self, forKeyPath: "hidden", options: .New | .Old, context: nil)
}
当视图控制器被释放时,确保移除观察者。
deinit {
label.removeObserver(self, forKeyPath: "hidden")
}
然后在 observeValueForKeyPath
方法中做任何你想做的事:
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
NSLog("\(change)")
// do whatever you want here
}
你可以像这样属性
var hideLabel: Bool = false {
didSet {
myLabel.isHidden = hideLabel
//SHOW OR HIDE OTHER VIEWS
}
}
通过这样做,您不必同时使用 KVO,您可以添加更多控件以隐藏以在 didSet 上下文中显示。
我相信这是一种更简单的方法来做这样的事情。
我想在 "sub-attribute" 变量上实现 didSet
。
示例:
@IBOutlet weak var myLabel: UILabel!
var myLabel.hidden { didSet{ "DO SOMETHING" } }
我想在 myLabel.hidden
属性更改时 hide/show 一些其他视图。
我该怎么做?
属性 观察者只能添加到 class,不能添加到实例。为了做到这一点,你需要 subclass UILabel
然后覆盖 hidden
的 属性 观察者。
编辑:如果您想在 CustomLabel 的实例上设置自定义观察者,您可以通过将块函数变量添加到在 didSet
或 willSet
[=15= 上触发的 CustomLabel 来轻松实现]
class CustomLabel: UILabel {
var onDidSetHidden: ((Bool) -> ())?
var onWillSetHidden: ((Bool) -> ())?
override var hidden: Bool {
didSet {
if let block = onDidSetHidden {
block(self.hidden)
}
}
willSet (willBeHidden) {
if let block = onWillSetHidden {
block(willBeHidden)
}
}
}
}
var custom = CustomLabel()
custom.onDidSetHidden = { (isHidden) in
if isHidden {
println("IS HIDDEN")
} else {
println("IS NOT HIDDEN")
}
}
custom.hidden = true //prints 'IS HIDDEN'
标准流程是使用KVO。加载视图时添加观察者:
override func viewDidLoad() {
super.viewDidLoad()
label.addObserver(self, forKeyPath: "hidden", options: .New | .Old, context: nil)
}
当视图控制器被释放时,确保移除观察者。
deinit {
label.removeObserver(self, forKeyPath: "hidden")
}
然后在 observeValueForKeyPath
方法中做任何你想做的事:
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
NSLog("\(change)")
// do whatever you want here
}
你可以像这样属性
var hideLabel: Bool = false {
didSet {
myLabel.isHidden = hideLabel
//SHOW OR HIDE OTHER VIEWS
}
}
通过这样做,您不必同时使用 KVO,您可以添加更多控件以隐藏以在 didSet 上下文中显示。 我相信这是一种更简单的方法来做这样的事情。