Как реализовать отмену / возврат с программным изменением textValue в NSTextView?

Я создал простое демонстрационное приложение с NSTextView и кнопкой, предоставил NSTextViewDelegate в textView и добавил действие:

- (IBAction)actionButtonClicked:(id)sender {
    NSString *oldText = [[[self.textView textStorage] string] copy];
    NSString *newText = @"And... ACTION!";

    [[self.textView undoManager] registerUndoWithTarget:self.textView
                                               selector:@selector(setString:)
                                                 object:oldText];
    [[self.textView undoManager] setActionName:@"ACTION"];

    [self.textView setString:newText];
}

Отменить / повторить работает без проблем, если вручную поменять текст. Но если я изменю текст с помощью метода действия, отмена будет работать, как и ожидалось, но повтор больше не работает (ничего не происходит), и диспетчер отмены, кажется, зашифрован ...

ОК - чтобы избежать проблем с NSTextView, я создал model, привязал к нему NSTextView и переместил отмену / повтор в модель, но это показывает то же поведение, что и раньше - что я делаю не так - это должно быть легко, не так ли?

#import "GFTextStore.h"

@implementation GFTextStore

@synthesize textVal = textVal_;

-(void)changeText{
    if (!undoMan_) {
        undoMan_ = [[[NSApplication sharedApplication] mainWindow] undoManager];   
    }

    NSAttributedString *oldText = [self.textVal copy];
    NSString *tempStr = [[oldText string] stringByAppendingFormat:@"\n%@",[[NSCalendarDate date]description]];
    NSAttributedString *newText = [[NSAttributedString alloc] initWithString:tempStr];

    [self setTextVal:newText];


    [undoMan_ registerUndoWithTarget:self
                            selector:@selector(setTextVal:)
                              object:oldText];

    [undoMan_ setActionName:@"ACTION"];
}
@end
10
задан user808667 25 November 2011 в 06:43
поделиться