Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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 NSUndoManager赢得';t撤消NSMutableDictionary的编辑_Objective C_Cocoa_Undo_Redo - Fatal编程技术网

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,并在字典中插入正确的对象,即使该对象在字典中出现两次,并且没有被新对象覆盖,重做(相同)对象。