我有一个关于使用符合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];
答案 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"]
相同的对象,这是值得怀疑的。)