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

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

введите здесь описание изображения


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

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

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

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

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


person Ramy Al Zuhouri    schedule 02.07.2012    source источник


Ответы (1)


Когда система Undo выполняет действие отмены, она ожидает, что вы зарегистрируете действия повтора, используя тот же код, что и для отмены (за исключением того, что NSUndoManager знает, что он перематывается назад, но вас это не должно волновать).

Поэтому добавьте правильные вызовы NSUndoManager в -setSliderValue:

person Julien    schedule 02.07.2012