mutableArrayValueForKey和调用insertObject之间的区别:inEmployeesAtIndex:直接

时间:2010-06-12 05:32:30

标签: cocoa cocoa-bindings key-value-observing

我有一个关于使用符合KVO的方法从数组插入/删除对象的问题。我正在通过Aaron Hillegass的Cocoa Programming for Mac OS X,我看到了以下代码行(在insertObject:inEmployeesAtIndex:方法中:

[[undoManager prepareWithInvocationTarget:self] removeObjectFromEmployeesAtIndex:index];

如果我错了,请纠正我,但我一直认为最好拨打mutableArrayValueForKey:然后removeObjectAtIndex: ...所以我尝试将上述行更改为:

[[undoManager prepareWithInvocationTarget:[self mutableArrayValueForKey:@"employees"]] removeObjectAtIndex:index]; 

它不起作用。有人可以解释差异以及为什么第一行有效但第二行没有?

UPDATE:我的removeObjectFromEmployeesAtIndex:index方法被实现为使我的集合类(NSMutableArray的一个实例)符合KVC。最后,调用[[self mutableArrayValueForKey:@"employees"] removeObjectAtIndex:index];应该最终调用[self removeObjectFromEmployeesAtIndex:index];

2 个答案:

答案 0 :(得分:1)

在您的更新中,您说:

  

调用[[self mutableArrayValueForKey:@“employees”] removeObjectAtIndex:index];应该最终调用[self removeObjectFromEmployeesAtIndex:index];

不幸的是,无论你的removeObjectFromEmployeesAtIndex:方法是什么都不正确,因为NSMutableArray永远不会调用你班级中的任何方法。由于您似乎尝试获取撤消/重做功能,因此必须使用removeObjectFromEmployeesAtIndex:之类的方法。否则,当您点击撤消添加员工时,您将无法“重做”添加该员工。对于个别员工的编辑,您也可能遇到撤消/重做问题。如果您愿意,可以将removeObjectFromEmployeesAtIndex:方法中的行改为[employees removeObjectAtIndex:index];[[self valueForKey:@"employees"] removeObjectAtIndex:index];[self.employees removeObjectAtIndex:index];,但实际上没有理由采用此路线。

答案 1 :(得分:0)

是。第一行(来自书中)基本上等同于:

id tmp = [undoManager prepareWithInvocationTarget:self];
[tmp removeObejctFromEmployeesAtIndex:index];

但是,您的代码基本上与此相同:

id tmp1 = [self mutableArrayValueForKey:@"employees"];
id tmp2 = [undoManager prepareWithInvocationTarget:tmp1];
[tmp2 removeObjectAtIndex:index];

换句话说,您准备调用的目标在您的代码中是不同的(除非self恰好是与[self mutableArrayValueForKey:@"employees"]相同的对象,这是值得怀疑的。)