Tôi tạo ra một ứng dụng demo đơn giản với một NSTextView và một nút, cung cấp một NSTextViewDelegate đến TextView và thêm một hành động:Làm thế nào để thực hiện hoàn tác/làm lại với sự thay đổi có lập trình của textValue của một 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 công trình không có vấn đề, nếu tôi thay đổi văn bản bằng tay. Nhưng nếu tôi thay đổi văn bản bằng phương thức hành động, hoàn tác hoạt động như mong đợi, nhưng làm lại không hoạt động nữa (không có gì xảy ra) và trình quản lý hoàn tác dường như bị xáo trộn ...
OK - để tránh các vấn đề với NSTextView tôi đã tạo một lớp mô hình, ràng buộc NSTextView với nó và di chuyển hoàn tác/làm lại mô hình, nhưng điều này cho thấy hành vi tương tự như trước - những gì tôi đang làm sai - điều này phải dễ dàng, phải không?
#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
Cảm ơn bạn Rob, nhưng điều đó không giải quyết được sự cố của tôi. Để tránh các vấn đề với NSTextView, tôi đã thực hiện một số thay đổi và di chuyển hoàn tác/làm lại đối với mô hình - xem câu hỏi đã chỉnh sửa ... – user808667