gpt4 book ai didi

objective-c - NSUndoManager 不会撤消 NSMutableDictionary 的编辑

转载 作者:行者123 更新时间:2023-12-03 17:36:53 26 4
gpt4 key购买 nike

我在撤消操作时遇到问题。以下代码不会撤消 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 不同,尽管 key id 保持不变。 NSMutableDictionary 对象是否有一些特殊的撤消/重做处理?

谢谢异音

最佳答案

听起来 NSUndoManager 正在完成它的工作,但是当需要删除该值时,字典中没有 NSBezierPath 键的对象。我的猜测是 NSBezierPath 用作字典键并不安全。您用作键的 NSBezierPath 对象可能在赋值和撤消之间的某个位置发生了变化,这意味着当您到达 removeFromDictionary: 时,其 hash 方法会有所不同,并且您不再拥有有意义的字典键。相反,请尝试使用与贝塞尔路径以某种方式关联的 NSString 或 NSNumber 作为字典键。

关于objective-c - NSUndoManager 不会撤消 NSMutableDictionary 的编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2916093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com