我的应用中有一个包含一堆控件的检查器窗格。这些控件通过NSArrayController
绑定到我的模型对象。根据选择的对象类型,我显示了一组不同的检查员(就像IB工作的方式一样)。检查器控制器观察阵列控制器的selection
,以便在选择更改时可以加载所需的检查器集。
问题是显然没有删除旧的检查员。即使检查员控制器没有对它们进行强有力的引用并将它们从超级视图中删除,它们仍然会粘在一起并将绑定错误记录到控制台:
[<Circle 0x102107df0> valueForUndefinedKey:]: this class is not key value
coding-compliant for the key width.
我的猜测是NSArrayController
因绑定而对控件有强烈的引用。这可能吗?在从superview中删除控件之前,我是否需要手动删除绑定?如何正确实现这样的检查器窗格?
接收器和anObserver都不会被保留。
所以我想在删除控件时应该自动删除绑定,不应该吗?
答案 0 :(得分:1)
问题在于,检查员控制器对selection
更改的响应与各种检查器视图在响应同一事物时更新自身之间没有定义的顺序。因此,新阵列控制器选择的“错误”检查器至少仍然存在一段时间,并试图访问元素对象的不存在的属性。
一个解决方法是不依赖于键值观察阵列控制器selection
来切换检查器组。更确切地说,有一个协调控制器 - 根据用户操作控制“选定对象” - 在更改选择之前清除检查器组,而不是切换新的检查器组,直到它被更改为止。