iOS -NSUndoManager перестает работать, когда какой-либо текст добавляется в textView - PullRequest
0 голосов
/ 25 февраля 2011

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

1 Ответ

0 голосов
/ 07 марта 2011

Вам нужно позвонить менеджеру по отмене, сообщив, что делать, когда вы хотите отменить.В этой функции отмены вы также сообщаете ей, как повторить ваши изменения.

Я использую следующую функцию для отмены:

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