【问题标题】:Key-Value-Observing closure never called on Boolean propertyKey-Value-Observing 闭包从不调用布尔属性
【发布时间】:2019-03-06 06:49:35
【问题描述】:

我有一个继承自 NSObject 的类 ToolbarManager。它有一个toolbar 属性,定义如下:

@objc dynamic let toolbar: NSToolbar

在我的类的初始化器中,我调用了以下代码:

init(toolbar: NSToolbar) {
    self.toolbar = toolbar
    toolbar.allowsUserCustomization = true
    observation = observe(\.toolbar.customizationPaletteIsRunning, options: [.old, .new]) {
        (_, change) in
        print("was running: \(change.oldValue)")
        print("is running: \(change.newValue)")
    }
}

其中observation 是另一个属性,定义如下:

var observation: NSKeyValueObservation?

当我运行应用程序并选择 自定义工具栏... 或关闭自定义视图时,观察闭包永远不会被调用,因此控制台不会打印任何内容。

为什么?

(我该如何解决这个问题?)


编辑:

Apple documentation 声明:

您只能对继承自 NSObject 的类使用键值观察。

我不确定如何理解这一点。这是否意味着可以观察到定义在 NSObject 子类上的任何属性,还是意味着只能跟踪属于 NSObject 子类的属性?

(后者会解释为什么我的代码不起作用,但是观察到普通 Swift 字符串的 this example 也不起作用。它确实起作用。)

【问题讨论】:

    标签: swift cocoa key-value-observing nstoolbar


    【解决方案1】:

    您只能对继承自 NSObject 的类使用键值观察。

    表示只能观察NSObject子类中的对象。

    确实意味着NSObject 的子类中的任何对象都是隐式可观察的。

    NSToolbar 的这个属性似乎不符合 KVO。

    【讨论】:

    • 有什么方法可以知道某个属性是否符合 KVO 标准?
    • 我不知道。使属性可观察的dynamic 属性不会出现在 Swift 标头中,即使该属性是可观察的。但是,如果不调用闭包,则不是
    • Observable 属性通常是这样记录的。无法从声明中确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多