-1

本文档中,Apple 描述了 To-One 和 To-Many 属性的访问器模式。多对多属性涵盖索引和无序集合。

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

显然,当NSArray持有树结构绑定到NSTreeController. 模型正在正确更新,例如在添加/删除元素或更改它们的顺序时,但从未调用访问器实现。

我在这里错过了什么吗?

4

1 回答 1

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;

没有任何-employeesor-setEmployees:访问器,也没有任何employeesor_employees实例变量。对于名为“employees”的索引集合属性,它仍然完全符合 KVC。如果NSTreeController给定这样一个节点并配置为使用“员工”作为子密钥路径,它可以很好地操纵该节点的员工。如果不是那些访问器方法,它可以使用什么?

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

于 2015-05-13T22:41:06.897 回答