我的应用程序中有一个检查器 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/