【问题标题】:Inline KVO of a Property in another view controller另一个视图控制器中属性的内联 KVO
【发布时间】:2017-07-23 13:25:14
【问题描述】:

我有一个带有动态 var“值”的 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 中“值”发生变化时在闭包中获得通知?

【问题讨论】:

    标签: swift key-value-observing swift4


    【解决方案1】:

    观察者被销毁是因为没有引用 在另一个视图控制器出现后给它。 你必须存储它

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

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

    一个独立的命令行项目示例:这会按预期打印“新字符串”:

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

    【讨论】:

    • 我试过这个,但没有得到任何结果。当我从父 vc 更改 vc.value 时,它​​将被触发,但如果从 vc 本身内部更改值则不会。真奇怪。
    • let m = {print ("xyz")}; let x = m(); let _ = m() 最后两条语句,都打印 xyz。所以我仍然想知道为什么使用_ 不起作用。还是它有效,但仅适用于单次执行,之后就消失了!?
    • @Honey:在这两种情况下,您都调用闭包m,这与上述示例不同。在_ = a.observe(\.value) { ... } 中,调用返回一个观察者,然后将其丢弃并销毁。
    • 所以我们有类、枚举、结构、闭包,你是说我们有别的名字observer,它们都不是?好的。
    • @Honey:这不是我的意思。观察者是某个类的一个实例。 – 在a.observe(\.value) { ... } 中,闭包不会立即执行,它由观察者存储,以便在观察值更改时调用。但是由于观察者被立即丢弃,因此永远不会执行闭包。
    猜你喜欢
    • 2012-04-02
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多