NSSliderを使用する単純なアプリケーションを作成しています。これは、2つのボタンで最大値または最小値に設定できます。元に戻すマネージャーは、すべての変更を追跡し、これら2つのボタンを使用して行われたすべての変更を元に戻す/やり直すことができます。
インターフェースは次のとおりです。
#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
実装:
#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
そして、アプリケーションのスクリーンショット:
元に戻すは正常に機能しますが、やり直しに問題があります。
たとえば、アプリケーションを起動した後:
- [最大にする]ボタンをクリックします。
- 次に、メニューの[編集] ->[元に戻す]を最大に設定します。
スライダーが元の位置に戻ります。
しかし、メニューの[編集]-> [最大に戻す]に移動すると、スライダーは最大位置に戻りません。そして、その理由がわかりません。