另一个视图控制器中的属性的内联KVO

时间:2017-07-23 13:25:15

标签: swift key-value-observing swift4

我有一个带有动态var“value”的vc,我需要知道它在调用cv的闭包中何时被更改。

目标vc:

@objc dynamic var value: String = ""

来源:

if let vc: TagButtonPopupViewController = sb.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("TagPopupViewController")) as? TagButtonPopupViewController {
        // configure vc
        vc.value = sender.title

        // observe
        _ = vc.observe(\.value) { (tbvc, change) in
            print("new string")
        }

        // present popup
        presentViewController(vc, asPopoverRelativeTo: sender.bounds, of: sender, preferredEdge: NSRectEdge.maxY, behavior: NSPopover.Behavior.transient)
    }

但从未调用过“观察”。 任何想法如果在Swift4中“值”发生变化时如何在闭包中得到通知?

1 个答案:

答案 0 :(得分:4)

观察者被销毁,因为没有参考 在呈现其他视图控制器之后到它。 你必须存储它

observer = vc.observe(\.value) { ... }

其中observer是调用视图控制器的属性。

一个独立的命令行项目示例:按预期打印“new string”:

class A: NSObject {
    @objc dynamic var value: String = ""
}

let a = A()
let observer = a.observe(\.value) { (_, _) in print("new string") } // (*)
a.value = "Hello world"

但如果(*)

替换,则不会打印任何内容
_ = a.observe(\.value) { (_, _) in print("new string") }