10

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
4

3 に答える 3

16
于 2012-08-01T13:39:57.103 に答える
5

-setString:から継承されたメソッドですNSText。メソッドのみを使用してこれを処理しNSTextView、元に戻す処理を行うには、次のようにします。

[self.textView setSelectedRange:NSMakeRange(0, [[self.textView textStorage] length])];
[self.textView insertText:@"And… ACTION!"];

このようにテキストを変更すると、元に戻すマネージャーをいじることがまったくなくなります。

于 2011-11-25T00:33:14.087 に答える