Objective c NSUndoManager赢得';t撤消NSMutableDictionary的编辑
我在撤消操作时遇到问题。以下代码不会撤消Objective c NSUndoManager赢得';t撤消NSMutableDictionary的编辑,objective-c,cocoa,undo,redo,Objective C,Cocoa,Undo,Redo,我在撤消操作时遇到问题。以下代码不会撤消removeObjectForKey:操作,但重做操作setObject:ForKey:有效 - (void) insertIntoDictionary:(NSBezierPath *)thePath { [[[window undoManager] prepareWithInvocationTarget:self] removeFromDictionary:thePath]; if(![[window undoManager] isUndoing
removeObjectForKey:
操作,但重做操作setObject:ForKey:
有效
- (void) insertIntoDictionary:(NSBezierPath *)thePath
{
[[[window undoManager] prepareWithInvocationTarget:self] removeFromDictionary:thePath];
if(![[window undoManager] isUndoing])
[[window undoManager] setActionName:@"Save Path"];
NSLog(@"Object id is: %d and Key id is: %d", [currentPath objectAtIndex:0], thePath);
[colorsForPaths setObject:[currentPath objectAtIndex:0] forKey:thePath];
}
- (void) removeFromDictionary:(NSBezierPath *)thePath
{
[[[window undoManager] prepareWithInvocationTarget:self] insertIntoDictionary:thePath];
if(![[window undoManager] isUndoing])
[[window undoManager] setActionName:@"Delete Path"];
NSLog(@"Object id is: %d and Key id is: %d", [colorsForPaths objectForKey:thePath], thePath);
[colorsForPaths removeObjectForKey:thePath];
}
控制台上的输出如下所示:
// Before setObject:ForKey:
Object id is: 1183296 and Key id is: 1423872
// Before removeObjectForKey:
UNDO
Object id is: 0 and Key id is: 1423872
我不明白为什么对象id不同,尽管键id保持不变。对NSMutableDictionary
对象是否有一些特殊的撤消/重做处理
thx
xonic在一个示例中,您正在记录
[currentPath objectAtIndex:0]
的地址,而在另一个示例中,您正在记录字典中任意键(甚至不是值,而是随机键)的地址。在代码中我看不出为什么它们应该是相同的。在一个示例中,您记录了[currentPath objectAtIndex:0]
的地址,在另一个示例中,您记录了字典中任意键(甚至不是值,而是随机键)的地址。我在代码中看不出为什么它们应该是一样的。听起来NSUndoManager正在做它的工作,但是当需要删除值时,字典中没有NSBezierPath键的对象。我的猜测是,NSBezierPath用作字典密钥是不安全的。您用作键的NSBezierPath对象可能在赋值和撤消之间的某个位置发生了变化,这意味着当您到达removeFromDictionary:
时,它的hash
方法就不同了,并且您不再拥有有意义的字典键。相反,尝试使用与bezier路径相关联的NSString或NSNumber作为字典键。听起来NSNDOManager正在完成它的工作,但当需要删除该值时,字典中没有用于NSBezier路径键的对象。我的猜测是,NSBezierPath用作字典密钥是不安全的。您用作键的NSBezierPath对象可能在赋值和撤消之间的某个位置发生了变化,这意味着当您到达removeFromDictionary:
时,它的hash
方法就不同了,并且您不再拥有有意义的字典键。相反,尝试使用与bezier路径相关联的NSString或NSNumber作为字典键。啊,该死,很抱歉。。。有一个玩代码时留下的片段。我累了,我猜:)我现在已经更正了代码,但是结果仍然不起作用。Thxah darn,很抱歉。。。有一个玩代码时留下的片段。我累了,我猜:)我现在已经更正了代码,但是结果仍然不起作用。ThxThx用于您的输入。事实上,我不确定这是否真的是问题所在。一方面,我在不同的文件(视图)中有相同的调用[colorsForPaths objectForKey:thePath],它返回正确的对象,但另一方面,重做操作记录正确的NSBezierPath id,并在字典中插入正确的对象,即使该对象在字典中出现两次,并且没有被新对象覆盖,为您的输入重做(相同)object.Thx。事实上,我不确定这是否真的是问题所在。一方面,我在不同的文件(视图)中有相同的调用[colorsForPaths objectForKey:thePath],它返回正确的对象,但另一方面,重做操作记录正确的NSBezierPath id,并在字典中插入正确的对象,即使该对象在字典中出现两次,并且没有被新对象覆盖,重做(相同)对象。