在此文档中,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
。可以捕获诸如拼写错误的方法/属性名称之类的东西。