Como implementar desfazer / refazer com alteração programática do textValue de um NSTextView?
Criei um aplicativo de demonstração simples com um NSTextView e um botão, que forneceu um NSTextViewDelegate ao textView e adicionei uma ação:
- (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];
}
Desfazer / refazer funciona sem problemas, se eu alterar o texto manualmente. Mas se eu alterar o texto com o método de ação, desfazer funciona como esperado, mas refazer não funciona mais (nada acontece) e o gerente de desfazer parece estar embaralhado ...
OK - para evitar problemas com o NSTextView, criei uma classe de modelo, vinculei o NSTextView a ele e movi o desfazer / refazer para o modelo, mas isso mostra o mesmo comportamento de antes - o que estou fazendo de errado - deve ser fácil , não deveria?
#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