使用NSUndoManager和prepareWithInvocationTarget,Gestures和Objects

时间:2012-03-20 18:50:24

标签: objective-c ios nsundomanager nsinvocation

我有各种各样的绘图应用程序。我想实现撤消/重做。虽然我在为Undo / Redo存储原始值和新值时遇到了困难。

使用手势我需要存储一些东西:变换,中心,对于属性对话框,我需要存储更多,颜色,字体,字体大小,轮廓,轮廓颜色,文本自我等等< / p>

我创建了一个NSMutableDictionary属性,用户可以在单个手势/属性弹出窗口中更改这些属性。

我想使用Rob's Answer for NSUndoManager and Rotation Gesture虽然使用他的解决方案与CGAffineTransform一起使用,当prepareWithInvocationTarget作为参数发送时,它不是一个对象而只是放一个{撤消/重做堆栈上的{1}}结构。

虽然在我CGAffineTransform使用prepareWithInvocationTarget时,我传入的字典(OriginalAttribs,newAttribs)不会被保留。我不能将它们作为本地iVars,因为它们会随着绘图对象上的每个动作而改变。

似乎我想将NSMutableDictionary用作retainArguments的一部分,尽管我并不想保留它们。我需要一份副本。

它的手势使得这很困难,因为我无法在手势处于活动状态时随时更改OrigianlCenter,OriginalTransform。

更新 我发现了这个link,它似乎与我想做的相似。

我设置了我的NSUndoManager:

NSInvocation

然后我收到运行时错误:

        //Needed to get access to UndoManager
    NSUndoManager * undoManager = [(IoScreenEditorViewController * )UIAppDelegate.ioMainViewController.currentViewController undoManager];

        //Need to Store our Center as a NSValue
    [undoManager prepareWithInvocationTarget:self];
    [undoManager forwardInvocation:anInvocation ];

-[NSUndoManager undoAttributesWithOriginalAttributes:newAttributes:]: unrecognized selector sent to instance 0xeedcbd0 是我为NSInvocation对象设置的选择器。根据文档here,它说它应该传递给自己(目标),而不是撤销经理自己?

0 个答案:

没有答案