当某些文本附加到textView时,iOS -NSUndoManager停止工作

时间:2011-02-25 10:50:43

标签: uitextview nsundomanager

所以我的问题是让我的textView能够执行撤消/重做操作(我使用两个按钮来执行此操作)。阅读文档我发现UITextView有一个内置的undoManager,他的基本用法非常简单。到目前为止我做了什么?

我有一个包含textView的viewController(EditorViewController)。

在EditorViewcontroller.h中

     NSUndoManager *myUndoManager;
在EditorViewController.m中 - > viewDidLoad中

    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堆栈。我希望有人可以给我一个提示..

1 个答案:

答案 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"];