如何使用 NSUndoManager 实现撤销?

发布于 2024-09-16 11:48:35 字数 385 浏览 5 评论 0原文

我正在尝试将 NSUndoManager 添加到我的程序中,但我不确定如何向管理器注册方法?使用:

[myUndoManager registerUndoWithTarget:selector:object:];

如果我有以下方法怎么办:

-(IBAction)tapButton:(id)sender {
   myFoo++;    
   yourFoo++;    //incrementing integers
   fooFoo++;
}

如何向撤消管理器注册此方法?选择器(发送者)的对象不是我要注册的。我需要通过一次撤消调用来减少 myFoo、yourFoo 和 fooFoo。

I am trying to add an NSUndoManager to my program but I am not sure how to register the methods with the manager? using :

[myUndoManager registerUndoWithTarget:selector:object:];

what if I have the following method:

-(IBAction)tapButton:(id)sender {
   myFoo++;    
   yourFoo++;    //incrementing integers
   fooFoo++;
}

How can I register this method with the undo manager? The object of the selector (sender) is not what I want to register. I need to decrement myFoo, yourFoo, and fooFoo with a single undo call.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一梦浮鱼 2024-09-23 11:48:35

编写另一个方法 -(void) decrementIntegers 并像这样注册:

[undoManager registerUndoWithTarget: self selector: @selector( decrementIntegers ) object: nil];

在这个方法中,您需要再次注册原始方法以提供重做:

[undoManager registerUndoWithTarget: self selector: @selector( tapButton: ) object: self];

但是更好的方法是使用您的访问器整数并撤消其中的注册。像这样的事情:

- (void) setMyFoo: (int) newMyFoo;
{
   if (myFoo != newMyFoo) {
      [[undoManager prepareWithInvocationTarget: self] setMyFoo: myFoo];
      myFoo = newMyFoo;
   }
}

Write another method -(void) decrementIntegers and register that like this:

[undoManager registerUndoWithTarget: self selector: @selector( decrementIntegers ) object: nil];

In this method you need to register your original method again to provide redo:

[undoManager registerUndoWithTarget: self selector: @selector( tapButton: ) object: self];

But a better way to do this would be to use accessors for your integers and do undo registering in there. Something like this:

- (void) setMyFoo: (int) newMyFoo;
{
   if (myFoo != newMyFoo) {
      [[undoManager prepareWithInvocationTarget: self] setMyFoo: myFoo];
      myFoo = newMyFoo;
   }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文