Deshacer / rehacer con un UITextView (iOS / iPHone)

Tengo una vista donde un UITextView siempre tiene foco. Lo que quiero hacer es extender el comportamiento de deshacer / rehacer incorporado para admitir deshacer / rehacer cuando configuro el texto mediante programación (por ejemplo, cuando lo borro, configurándolo en @ "").

Como solo el firstResponder obtiene eventos de deshacer / rehacer, pensé que simplemente usaría la propiedad undoManager de UITextView para crear mis invocaciones. p.ej.,

// 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:@""];  
    }
}

Lamentablemente, esto no está funcionando. Eso:

Introduce un elemento vacío en la pila de deshacer ("Deshacer")El "Deshacer Borrar" se agrega después de ese elemento (si toco "Deshacer", veo "Deshacer Borrar")Sin embargo, Deshacer Borrar y Rehacer Borrar trabajo, entonces veo "Deshacer Borrar" nuevamente y no funciona a partir de ahí.

¿Algunas ideas? ¿Me estoy acercando a esto mal?

Actualizar: Parece que he descubierto el problema del elemento de deshacer vacío: sucede cuando configuro el texto de UITextViewdespués Llamé a prepareWithInvocationTarget. Si lo llamo antes, no sucede. Lo curioso es que el elemento vacío no se inserta en la pila de deshacer si no llamo prepareWithInvocationTarget (es decir, normalmente, cuando configuro el texto de un UITextView).

Respuestas a la pregunta(3)

Su respuesta a la pregunta