【问题标题】:Safely remove NSView that contains cocoa bindings安全删除包含可可绑定的 NSView
【发布时间】:2013-08-12 23:08:16
【问题描述】:

我的应用中有一个检查器窗格,其中包含一堆控件。这些控件通过NSArrayController 绑定到我的模型对象。根据选择的对象类型,我将显示一组不同的检查器(就像 IB 的工作方式一样)。检查器控制器观察数组控制器的selection,以便在选择更改时加载所需的检查器集。

问题是旧的检查器显然没有被删除。即使检查器控制器没有对它们进行强引用并且它们已从其超级视图中删除,它们仍然会留下并将绑定错误记录到控制台:

[<Circle 0x102107df0> valueForUndefinedKey:]: this class is not key value 
coding-compliant for the key width.

我的猜测是,NSArrayController 由于绑定而持有对控件的强引用。这可能吗?在从超级视图中删除控件之前,我是否必须手动删除绑定?如何正确实现这样的检查器窗格?


编辑:文档说

既不保留接收者,也不保留观察者。

所以我猜应该在移除控件时自动移除绑定,不是吗?

【问题讨论】:

    标签: objective-c macos cocoa-bindings key-value-observing nsarraycontroller


    【解决方案1】:

    问题在于检查器控制器对selection 更改的响应与各种检查器视图更新自身以响应相同的事情之间没有定义的顺序。因此,新数组控制器选择的“错误”检查器至少在短时间内仍然存在,并试图访问元素对象不存在的属性。

    一个解决方法是不依赖于观察数组控制器selection 的键值对来切换检查器集。相反,让一个协调控制器(无论哪个根据用户操作控制“选定对象”)在更改选择之前清除检查器集,并且在更改后才切换新检查器集。

    【讨论】:

    • 是的,根据我的经验,您可以依赖 KVO 来构建视图层次结构,您可以使用 KVO 绑定视图层次结构中的内容,但不能同时使用两者。简而言之,如果您在 KVO 通知处理程序中添加或删除观察者,KVO 会感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2019-04-04
    相关资源
    最近更新 更多