1

我有一个关于使用符合 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]; 

它没有用。有人可以解释其中的区别以及为什么第一行有效而第二行无效吗?

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

4

2 回答 2

1

在您的更新中,您说:

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

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

于 2010-06-30T03:56:16.687 回答
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"],这是值得怀疑的)。

于 2010-06-28T16:25:14.600 回答