iOS -NSUndoManager перестает работать, когда некоторый текст добавляется к textView

Итак, моя проблема состоит в том, чтобы сделать мой textView способным отменить / повторить действие (для этого я использую две кнопки). Читая документ, я обнаружил, что UITextView имеет встроенный undoManager, и его базовое использование действительно простое. Что я сделал до сих пор?

У меня есть viewController (EditorViewController), содержащий textView.

в EditorViewcontroller.h

     NSUndoManager *myUndoManager;

в EditorViewController.m -> viewDidLoad

    myUndoManager = [textView undoManager];

как я сказал, две кнопки используются для выполнения действий отмены / повтора, две кнопки расположены в inputAccessoryView textView, это представление в основном представляет собой панель инструментов с несколькими кнопками, используемыми для добавления текста в 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:, отмена и повтор не выполняются. Если я снова начинаю писать с помощью клавиатуры, выполняются отмена и повтор (первый элемент стека отмены - это последний записанный текст) Это как если бы стек отмены и повтора очищается каждый раз, когда я добавляю текст. Надеюсь, кто-нибудь мне подскажет ..


person oiledCode    schedule 25.02.2011    source источник


Ответы (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"];
person appmattus    schedule 07.03.2011