objective-c - 安全删除包含 cocoa 绑定(bind)的 NSView

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

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

问题是旧的检查员组显然没有被移除。即使检查器 Controller 没有对它们进行强引用并且它们已从它们的 super View 中删除,它们仍然存在并将绑定(bind)错误记录到控制台:

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

我的猜测是 NSArrayController 由于绑定(bind)而持有对控件的强引用。这可能吗?在从 super View 中删除控件之前,我是否必须手动删除绑定(bind)?我如何正确地实现这样的检查器 Pane ?


编辑:文档说

Neither the receiver, nor anObserver, are retained.

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

最佳答案

问题在于检查器 Controller 对选择 更改的响应与各种检查器 View 更新自身以响应同一事件之间没有定义的顺序。因此,新数组 Controller 选择的“错误”检查器至少会存在一小段时间,并试图访问元素对象的不存在属性。

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

关于objective-c - 安全删除包含 cocoa 绑定(bind)的 NSView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18198125/

相关文章:

objective-c - 为什么我的 Cocoa 绑定(bind)损坏了?

objective-c - Cocoa 以编程方式绑定(bind)+不更新值?

android - 沙盒账户的交易工作正常,不适用于使用万事达卡的真实账户

objective-c - 在运行时替换SQLite数据库

objective-c - Cocoa 共享软件注册

c - 在 mac 上的终端中运行一个 c 程序

objective-c - iOS9 用自定义 uiwindow 覆盖状态栏 - 错误的位置

iphone - 同步 UIScrollView 滚动

ios - Swift 对象的安全内存

macos - 将 NSTableView 绑定(bind)到 Swift 中的字符串数组