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

Inline KVO of a Property in another view controller

我有一个带有动态变量 "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)
    }

但 "observe" 从未被调用。 任何想法如何在 "value" 在 Swift4 中发生变化时在闭包中得到通知?

由于没有引用,观察者被销毁 在呈现另一个视图控制器之后。 你必须存储它

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") }