Реализовать переменное свойство атрибута наблюдателя в Swift
Я хочу реализовать didSet
над "податрибутом" переменной.
Пример:
@IBOutlet weak var myLabel: UILabel!
var myLabel.hidden { didSet{ "DO SOMETHING" } }
Я хочу скрыть / показать некоторые другие виды, когда myLabel.hidden
изменение атрибута. Как мне это сделать?
3 ответа
Вы можете сделать собственность как это
var hideLabel: Bool = false {
didSet {
myLabel.isHidden = hideLabel
//SHOW OR HIDE OTHER VIEWS
}
}
Делая это, вам не нужно использовать KVO одновременно, вы можете добавить больше элементов управления, чтобы скрыть их для отображения в контексте didSet. Я считаю, что это более простой способ сделать такую вещь.
Стандартный процесс заключается в использовании КВО. Добавить наблюдателя, когда представление загружено:
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
}
Наблюдатели свойств могут быть добавлены только к классу, а не к экземпляру. Для этого вам нужно создать подкласс UILabel
а затем переопределить hidden
Собственность наблюдателей.
РЕДАКТИРОВАТЬ: Если вы хотите установить пользовательских наблюдателей на экземпляры CustomLabel, вы можете легко сделать это, добавив переменные блочной функции в свой CustomLabel, которые запускаются на didSet
или же willSet
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'