Отменить / повторить с помощью UITextView (iOS / iPHone)

У меня есть представление, где 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:@""];  
    }
}

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

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

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

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

Ответы на вопрос(3)

Ваш ответ на вопрос