NSUndoManager :повтор не работает

Я делаю простое приложение, использующее 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

Реализация:

#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

И скриншот приложения:

enter image description here


Отмена работает нормально, но у меня проблемы с повтором.

Например после запуска приложения:

  • Я нажимаю кнопку поставить на максимум .
  • Затем меню Редактировать-> Отменить до макс. .

Ползунок возвращается на прежнее место.

Но если я зайду в меню Правка -> Вернуть до максимума , ползунок не вернется в максимальное положение. И я не понимаю, почему.

6
задан Guillaume 27 February 2014 в 10:29
поделиться