在本文档中,Apple 描述了 To-One 和 To-Many 属性的访问器模式。多对多属性涵盖索引和无序集合。
这让我想到了一个问题:
树结构是否有不同的访问器模式,或者我们应该使用(或适应)与其他类型的集合相同的访问器模式?
显然,当NSArray
持有树结构绑定到NSTreeController
. 模型正在正确更新,例如在添加/删除元素或更改它们的顺序时,但从未调用访问器实现。
我在这里错过了什么吗?
在本文档中,Apple 描述了 To-One 和 To-Many 属性的访问器模式。多对多属性涵盖索引和无序集合。
这让我想到了一个问题:
树结构是否有不同的访问器模式,或者我们应该使用(或适应)与其他类型的集合相同的访问器模式?
显然,当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
or-setEmployees:
访问器,也没有任何employees
or_employees
实例变量。对于名为“employees”的索引集合属性,它仍然完全符合 KVC。如果NSTreeController
给定这样一个节点并配置为使用“员工”作为子密钥路径,它可以很好地操纵该节点的员工。如果不是那些访问器方法,它可以使用什么?
只是为了好的措施,一定要在你所有的自定义类中实现+accessInstanceVariablesDirectly
返回NO
。这可以捕获诸如拼写错误的方法/属性名称之类的东西。