4

我想实现didSet一个变量的“子属性”。

例子:

@IBOutlet weak var myLabel: UILabel!
var myLabel.hidden { didSet{ "DO SOMETHING" } }

我想在myLabel.hidden属性更改时隐藏/显示其他一些视图。我该怎么做?

4

3 回答 3

5

你可以做这样的财产

    var hideLabel: Bool = false {
    didSet {
        myLabel.isHidden = hideLabel
        //SHOW OR HIDE OTHER VIEWS
    }
}

通过这样做,您不必同时使用 KVO,您可以添加更多控件来隐藏以在 didSet 上下文中显示。我相信这是做这种事情的一种更简单的方法。

于 2017-07-13T10:08:33.037 回答
2

标准流程是使用 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
}
于 2015-03-04T16:57:10.177 回答
1

属性观察者只能添加到类中,不能添加到实例中。为了做到这一点,您需要继承UILabel并覆盖hidden的属性观察者。

编辑:如果您想在 CustomLabel 的实例上设置自定义观察者,您可以通过将块函数变量添加到触发didSet或触发的 CustomLabel 轻松地做到这一点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'
于 2015-03-04T15:20:58.850 回答