Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 树的KVC访问器模式_Objective C_Cocoa_Kvc_Nstreecontroller - Fatal编程技术网

Objective c 树的KVC访问器模式

Objective c 树的KVC访问器模式,objective-c,cocoa,kvc,nstreecontroller,Objective C,Cocoa,Kvc,Nstreecontroller,在中,Apple描述了对一和对多属性的访问器模式。许多属性包括索引集合和无序集合 这就引出了一个问题: 对于树结构是否有不同的访问器模式,或者我们是否应该使用(或调整)与其他类型的集合相同的模式? 显然,当持有树结构的NSArray绑定到NSTreeController时,在我的模型中实现对多个访问器的索引并在其中设置断点没有任何效果。模型正在正确更新,例如在添加/删除元素或更改其顺序时,但从未调用访问器实现 我在这里遗漏了什么吗?与数组不同,树不是一个数据结构。您可以从单个根节点开始,在这种情

在中,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
\u employees
实例变量。对于名为“employees”的索引集合属性,它仍然完全符合KVC。如果一个
NSTreeController
被赋予这样一个节点,并被配置为使用“employees”作为子密钥路径,那么它可以很好地操纵该节点的雇员。如果没有这些访问器方法,它可以使用什么


为了更好地衡量,请确保在所有自定义类中直接实现
+accessInstanceVariables
以返回
NO
。这可能会捕捉到诸如拼写错误的方法/属性名称之类的信息。

是否介意选民自己解释?感谢您的解释,这很有意义。我创建了一个测试项目,并验证了在添加/删除等操作中确实调用了KVC方法。这里的罪魁祸首是NSTreeController的-moveNodes:toIndexPath:method,它显然没有使用标准KVC方法来履行其职责。我会接受你的回答,并就这个话题提出一个新问题。