Я создал простое демонстрационное приложение с 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