树木的KVC访问模式

时间:2015-05-13 18:40:17

标签: objective-c cocoa kvc nstreecontroller

this document中,Apple描述了To-One和To-Many属性的访问者模式。 To-Many属性包括Indexed和Unordered集合。

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

显然,当持有树结构的NSArray绑定到NSTreeController时,在我的模型中实现Indexed To-Many访问器并在其中设置断点不起作用。模型正确更新,例如添加/删除元素或更改其顺序时,从不调用Accessor实现。

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

树不是一个数组结构,与数组的方式相同。您可以从单个根节点开始,在这种情况下,该属性是与该节点的一对一关系,或者是顶级节点的数组,在这种情况下,该属性是与这些节点的多对多关系。树的其他级别是与那些根节点不同的关系,而不是提供根节点的对象。

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实例变量。对于名为" employees"的索引集合属性,它仍然完全符合KVC标准。如果给NSTreeController这样的节点并配置为使用"雇员"作为儿童的关键路径,它可以操纵该节点的员工。如果不是那些访问方法,它可以使用什么?

为了更好地衡量,请确保在所有自定义类中实施+accessInstanceVariablesDirectly以返回NO。这可以捕获拼写错误的方法/属性名称等内容。