Ho creato una semplice applicazione demo con un NSTextView e un pulsante, il fornito un NSTextViewDelegate al textView e ha aggiunto un'azione:Come implementare l'annullamento/ripristino con la modifica programmata del valore testo di un NSTextView?
- (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 lavori senza problemi, se cambio il testo a mano. Ma se cambio il testo con il metodo action, annulla il lavoro come previsto, ma il redo non funziona più (non succede nulla) e il gestore di annullamento sembra essere criptato ...
OK - per evitare problemi con NSTextView ho creato una classe del modello, associato a NSTextView e spostato l'annullamento/ripristino nel modello, ma questo mostra lo stesso comportamento di prima - cosa sto facendo male - dovrebbe essere semplice, non dovrebbe?
#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
Grazie Rob, ma questo non risolve il mio problema. Per evitare problemi con NSTextView ho apportato alcune modifiche e ho spostato l'annullamento/ripristino nel modello: vedere la domanda modificata ... – user808667