Реализовать переменное свойство атрибута наблюдателя в 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'
Другие вопросы по тегам