【问题标题】:iOS -NSUndoManager stops working when some text is appended to a textView当某些文本附加到 textView 时,iOS -NSUndoManager 停止工作
【发布时间】:2011-07-04 05:33:45
【问题描述】:

所以我的问题是让我的 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: 方法追加一些文本时,不会执行撤消和重做。如果我开始使用键盘再次写入撤消和重做(撤消堆栈的第一个元素是最后写入的文本)就像 if每次我附加一些文本时,撤消和重做堆栈都会被清除。我希望有人能给我一个提示..

【问题讨论】:

    标签: uitextview nsundomanager


    【解决方案1】:

    您必须调用撤消管理器,告诉它在您想要撤消时要做什么。在此撤消功能中,您还可以告诉它如何重做您的更改。

    我使用以下函数进行撤消:

    - (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"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多