6

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

そして、アプリケーションのスクリーンショット:

ここに画像の説明を入力してください


元に戻すは正常に機能しますが、やり直しに問題があります。

たとえば、アプリケーションを起動した後:

  • [最大にする]ボタンをクリックします。
  • 次に、メニューの[編集] ->[元に戻す]を最大に設定します。

スライダーが元の位置に戻ります。

しかし、メニューの[編集]-> [最大に戻す]に移動すると、スライダーは最大位置に戻りません。そして、その理由がわかりません。

4

1 に答える 1

18

元に戻すシステムが元に戻すアクションを実行するとき、元に戻すのと同じコードを使用してやり直しアクションを登録することを期待します(ただし、NSUndoManager巻き戻しであることを知っている場合を除きますが、気にする必要はありません)。

したがって、適切なNSUndoManager呼び出しを追加します-setSliderValue:

于 2012-07-02T00:28:44.813 に答える