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];
}
手でテキストを変更すると、元に戻す/やり直しは問題なく機能します。しかし、アクションメソッドでテキストを変更すると、元に戻すは期待どおりに機能しますが、やり直しは機能しなくなり (何も起こりません)、元に戻すマネージャーが混乱しているようです...
OK - 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