Ram*_*uri 6 cocoa objective-c nsundomanager nsslider
我正在创建一个使用NSSlider的简单应用程序,可以使用两个按钮将其置于最大值或最小值.撤消管理器应跟踪所有更改并允许撤消/重做使用这两个按钮所做的所有更改.
这是界面:
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
@private
NSUndoManager* undoManager;
}
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSSlider *slider;
- (IBAction)putToMax:(id)sender;
- (IBAction)putToMin:(id)sender;
- (void) setSliderValue: (float) value;
@end
Run Code Online (Sandbox Code Playgroud)
执行:
#import "AppDelegate.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize slider = _slider;
- (NSUndoManager*) windowWillReturnUndoManager: (NSWindow*) window
{
return undoManager;
}
- (IBAction)putToMax:(id)sender
{
float value= [_slider floatValue];
[ [undoManager prepareWithInvocationTarget: self] setSliderValue: value];
if(![undoManager isUndoing])
[undoManager setActionName: @"Put to Max"];
NSLog(@"%f value added to the stack",value);
[_slider setFloatValue: 100.0];
}
- (IBAction)putToMin:(id)sender
{
float value= [_slider floatValue];
[ [undoManager prepareWithInvocationTarget: self] setSliderValue: value];
if(![undoManager isUndoing])
[undoManager setActionName: @"Put to Min"];
NSLog(@"%f value added to the stack",value);
[_slider setFloatValue: 0.0];
}
- (void) setSliderValue: (float) value
{
[_slider setFloatValue: value];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
}
- (id) init
{
self=[super init];
if(self)
{
undoManager=[[NSUndoManager alloc]init];
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
以及该应用程序的屏幕截图:

撤消工作正常,但我有重做的问题.
例如,启动应用程序后:
滑块返回原位.
但是如果我进入菜单编辑 - >重做放到最大,滑块不会回到它的最大位置.我不明白为什么.
Jul*_*ien 18
当撤销系统执行撤消操作时,它希望您使用与撤消相同的代码注册重做操作(除了NSUndoManager知道它正在倒带 - 但您不应该在意).
因此,添加适当的NSUndoManager调用 -setSliderValue:
| 归档时间: |
|
| 查看次数: |
2669 次 |
| 最近记录: |