树木的KVC登录图案



在此文档中,Apple描述了一个待办事项和多个属性的访问模式。经过的属性涵盖了索引和无序的收藏。

这使我提出了一个问题:
是否有不同的访问者模式,或者我们应该使用(或适应)与其他类型的集合相同?

显然,当持有树结构的NSArray绑定到NSTreeController时,在我的模型中实现索引刻度的登录并在其中设置断点没有效果。该模型正在正确更新,例如添加/删除元素或更改其订购时,访问器实现从未被调用。

我在这里错过了什么吗?

树不是一个数据结构,就像数组一样。您要么从单个根节点开始,在这种情况下,属性是与该节点的一种关系,或者是顶级节点的数组,在这种情况下,属性是与这些节点的经常关系。树的其他级别是与这些根节点的单独关系,而不是来自提供根节点的对象。

NSTreeController配置了儿童密钥路径。它使用每个节点上的关键路径来访问每个节点的孩子。如果是添加或删除节点,那将是通过KVC的父母节点的突变。(它可能在父上使用-mutableArrayValueForKeyPath:,然后在结果代理上使用NSMutableArray方法。)应该通过父对象上的索引集合突变访问器。

您确定在正确的类上实现了访问者(并在其中设置断点)?

该框架除了使用KVC访问和突变您的财产外,该框架确实别无选择。如果KVC为属性,则将使用您的访问者方法。根据您的实施方式,KVC可能别无选择,只能调用您的访问者方法。例如,您可以实现一个索引收集属性,而无需任何数组类型的getter或setter或任何备份的数组实例变量(或者它可以具有一个实例变量,其名称完全与属性名称完全无关)。

例如,类可以实现:

- (NSUInteger) countOfEmployess;
- (id) objectInEmployeesAtIndex:(NSUInteger)index;
- (void)insertObject:(id)anObject inEmployeesAtIndex:(NSUInteger)index;
- (void)removeObjectFromEmployeesAtIndex:(NSUInteger)index;

没有任何-employees-setEmployees:访问者,或任何employees_employees实例变量。对于名为"员工"的索引收集属性,它仍然完全符合KVC。如果给出了NSTreeController这样的节点并配置为使用"员工"作为孩子的关键路径,则可以操纵Node的员工很好。如果不是那些访问者方法,它可以使用什么?

为了良好的措施,请确保实现+accessInstanceVariablesDirectly在所有自定义类中返回NO。可以捕获诸如拼写错误的方法/属性名称之类的东西。

最新更新