Я создал простое демонстрационное приложение с 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];
}
Undo / redo работает без проблем, если я изменяю текст вручную. Но если я изменю текст с помощью метода действия, отмена будет работать, как ожидалось, но повторить больше не будет (ничего не происходит), и диспетчер отмены, кажется, зашифрован ...
Хорошо - чтобы избежать проблем с NSTextView, я создал класс модели, привязал к нему 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