所以我的问题是让我的textView能够执行撤消/重做操作(我使用两个按钮来执行此操作)。阅读文档我发现UITextView有一个内置的undoManager,他的基本用法非常简单。到目前为止我做了什么?
我有一个包含textView的viewController(EditorViewController)。
在EditorViewcontroller.h中
NSUndoManager *myUndoManager;
myUndoManager = [textView undoManager];
正如我所说,两个按钮用于执行撤消/重做操作,这两个按钮位于textView的inputAccessoryView中,这个视图基本上是一个工具栏,带有几个用于将文本追加到textView的按钮。
我有一个名为appendText的方法:
- (IBAction) appendText:(id)sender{
NSString *contentsToAdd;
NSMutableString *textViewContent;
NSRange cursorPosition;
if ([undoManager canUndo]) {
NSLog(@"yes canundo");
}
switch ([sender tag]) {
case 0:
[textView setScrollEnabled:NO];
contentsToAdd = @"[]";
cursorPosition = [textView selectedRange];
textViewContent = [[NSMutableString alloc]
initWithString:[textView text]];
[textViewContent insertString:contentsToAdd
atIndex:cursorPosition.location];
[textView setText:textViewContent];
[textViewContent release];
cursorPosition.location++;
textView.selectedRange=cursorPosition;
[textView becomeFirstResponder];
[textView setScrollEnabled:YES];
if (![undoManager canUndo]) {
NSLog(@" can't undo");
}
break;
// more case following 0..9
case 10:
[myUndoManager undo];
[break];
case 11 :
[myUndoManager redo];
break;
}
如果我使用键盘编写,现在情况很好,我的意思是撤消和重做正常工作。但是当我使用appendText:方法附加一些文本时,不会执行undo和redo。如果我再次使用键盘执行undo和redo(撤消堆栈的第一个元素是最后写入的文本),就像是每次添加一些文本时,都会清除undo和redo堆栈。我希望有人可以给我一个提示..
答案 0 :(得分:0)
您必须调用撤消管理器,告诉它在您要撤消时要执行的操作。在此撤消功能中,您还可以告诉它如何重做您的更改。
我使用以下函数进行撤消:
- (void) undoText:(NSString*)text range:(NSRange)range {
[[textView.undoManager prepareWithInvocationTarget:self] undoText:[NSString stringWithString:c textView.text] range:textView.selectedRange];
textView.text = text;
textView.selectedRange = range;
}
在你的appendText函数中,你必须在它的顶部执行以下操作:
[[textView.undoManager prepareWithInvocationTarget:self] undoText:[NSString stringWithString:textView.text] range:textView.selectedRange];
[textView.undoManager setActionName:@"name to appear in undo"];