2010-11-01 44 views
3

J'ai une vue où un UITextView a toujours le focus. Ce que je veux faire est d'étendre le comportement d'annulation/rétablissement intégré pour prendre en charge annuler/refaire pour quand je programme par programme le texte (par exemple, pour quand je l'efface, en le mettant à @ "").Annuler/rétablir avec UITextView (iOS/iPHone)

Comme seul le firstResponder obtient des événements annuler/rétablir, j'ai pensé que j'utiliserais simplement la propriété undoManager de UITextView pour créer mes invocations. par exemple,

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

Malheureusement, cela ne fonctionne pas. Il:

  1. Introduit un élément vide dans la pile undo (« Annuler »)
  2. Le « Annuler Effacer » est ajouté après l'article (si je tape « Annuler », je vois « Annuler Effacer »)
  3. Annuler Effacer et Rétablir Effacer le travail, cependant, je vois à nouveau "Annuler Effacer" et cela ne fonctionne plus à partir de là.

Des idées? Est-ce que je m'approche de ce problème?

Mise à jour: Il semble que j'ai compris la question de l'article undo vide: il arrive quand je mets le texte de la UITextView après j'ai appelé prepareWithInvocationTarget. Si je l'appelle avant, ça n'arrivera pas. Chose amusante, l'élément vide n'est pas poussé sur la pile d'annulation si je n'appelle pas prepareWithInvocationTarget (c'est-à-dire, normalement, lorsque je définis le texte d'un UITextView).

Répondre

3

OK, figured it out:

Le problème aveC# 1 est tel que décrit dans la mise à jour à mon poste d'origine.

Problèmes n ° 2 et n ° 3 étaient juste moi en utilisant le NSUndoManager incorrectement. Ma méthode manque de clarté finale (qui est appelée sur undos est la suivante:.

-(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]; 
}

Il fonctionne comme il se doit maintenant

+0

Salut, je pense que mon problème est similaire à cela, u peut me dire, dans quelle méthode vous appelez la méthode undoClear? merci –

+0

@Risma: Juste avant de définir le contenu de textView. –

+1

Un problème que j'ai cependant, en essayant d'implémenter cette méthode, est que tous les annulations antérieures sont effacées. Donc, si elles tapent, puis appuyez sur "effacer" et que vous souhaitez annuler deux fois, il va juste revenir à ce que leur contenu de texte était avant. – Philosophistry

0

Je ne poursuis combien de champs de texte que vous travaillez avec, si textBackup n'est pas est conservé par prepareWithInvocationTarget: Comment est-il toujours dans le Undo Stack plusieurs clear est plus tard? On dirait qu'il pourrait encore être là après le premier, mais pas après le 2ème ou après le vidage de la liste Autorelease

1

Vous pouvez changer votre textview à n'importe quel texte que vous voulez et préserver défaire et refaire les piles de mémoire du gestionnaire. s 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 
} 

} 

// juste, ma méthode que je crée

-(void) undoClearBlablabla:(NSString*) text 
    { 
     [[self.content.undoManager prepareWithInvocationTarget:self] undoClear:self.content.text]; 
     [self.content setText:text]; 
    } 
+0

Pourquoi avez-vous -1 cela? Peux-tu expliquer? C'est une très bonne solution de travail pour moi. – coolcool1994

+0

Oui, s'il vous plaît, expliquez pourquoi quelqu'un-cela, cela semble correct! – strange