Отменить / повторить с помощью UITextView (iOS / iPHone) - PullRequest
3 голосов
/ 01 ноября 2010

У меня есть представление, где UITextView всегда имеет фокус.То, что я хочу сделать, это расширить встроенное поведение отмены / повтора для поддержки отмены / повтора, когда я программно устанавливаю текст (например, когда я его очищаю, устанавливая его в @ "").

Поскольку только firstResponder получает события отмены / повтора, я подумал, что просто использую свойство undoManager UITextView для создания моих вызовов.например,

// Before clearing the text...
[[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:self.myTextView.text]; 
[self.myTextView.undoManager setActionName:@"Clear"];

// ...

-(void)undoClear:(NSString *)textToRestore
{
    self.myTextView.text = textToRestore;
    if ([self.myTextView.undoManager isUndoing])
    {
      // Prepare the redo.
      [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:@""];  
    }
}

К сожалению, это не работает.Это:

  1. Вносит пустой элемент в стек отмены («Отменить»)
  2. «Отменить удаление» добавляется после этого элемента (если я нажимаю «Отменить», я вижу«Undo Clear»)
  3. Undo Clear и Redo Clear работают, однако, затем я снова вижу «Undo Clear», и с этого момента он не работает.

Есть идеи?Я подхожу к этому неправильно?

Обновление: Кажется, я выяснил проблему пустого элемента отмены: это происходит, когда я устанавливаю текст UITextView после Я позвонил prepareWithInvocationTarget.Если я позвоню раньше, этого не произойдет.Самое смешное, что пустой элемент не помещается в стек отмены, если я не вызываю prepareWithInvocationTarget (то есть, обычно, когда я устанавливаю текст UITextView).

Ответы [ 3 ]

3 голосов
/ 01 ноября 2010

ОК, разобрался:

Проблема с # 1 описана в обновлении к моему исходному посту.

Проблемы № 2 и № 3 были только из-за того, что я неправильно использовал NSUndoManager.Мой последний метод unClear (который вызывается при отмене операции выглядит следующим образом:

-(void)undoClear:(NSString *)textToRestore
{   
    NSString *textBackup = [self.myTextView.text copy];

    self.myTextView.text = textToRestore;

    if ([self.myTextView.undoManager isUndoing])
    {
        // Prepare the redo.
        [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:@""];     
    }
    else if ([self.myTextView.undoManager isRedoing])
    {
        [[self.myTextView.undoManager prepareWithInvocationTarget:self] undoClear:textBackup];
    }

    [textBackup release];
}

Он работает, как и сейчас.

1 голос
/ 30 октября 2013

Вы можете изменить текстовое представление на любой другой, какой захотите, и сохранить стеки памяти менеджера отмены и повтора.self.content - это UITextView.

-(void) yourClearAllButtonIsPressed
{
    [[self.content.undoManager prepareWithInvocationTarget:self] undoClear:self.content.text];
    [self.content setText:@""];//Or something else you want to change your textview to
}

}

// просто один, мой метод я создал

-(void) undoClearBlablabla:(NSString*) text
    {
        [[self.content.undoManager prepareWithInvocationTarget:self] undoClear:self.content.text];
        [self.content setText:text];
    }
0 голосов
/ 21 марта 2012

Я не судюсь с тем, сколько текстовых полей вы работаете, хотя textBackup не сохраняется prepareWithInvocationTarget: Как это все еще в стеке отмены несколько раз позже? Похоже, что он все еще может быть там после первого, но не после 2-го или после сброса пула автоматического выпуска.

...