2010-03-15 9 views
12

Mon application n'utilise pas encore les données de base. Est-il vrai que doit utiliser Core Data pour annuler/rétablir?Comment annuler/refaire fonctionne essentiellement sur iPhone OS?

Et: Comment l'utilisateur fait-il l'annulation/le rétablissement? Je ne l'ai jamais vu en action et je ne l'ai jamais utilisé. Je ne sais pas comment je devrais le faire si je le voulais. Il n'y a aucun bouton Annuler/Refaire n'importe où. Pourtant, ils disent qu'il a défait/refait. Alors, comment l'utilisateur déclenche-t-il cela?

Répondre

35

iPhone OS 3.0 a apporté le concept de NSUndoManager du Mac, ce qui permet de défaire l'iPhone. NSUndoManager gère une pile de NSInvocations qui sont les actions opposées aux modifications ou autres modifications que vous effectuez. Par exemple,

- (void)observeValueForKeyPath:(NSString*)keyPath 
         ofObject:(id)object 
         change:(NSDictionary*)change 
         context:(void*)context 
{ 
    NSUndoManager *undo = [self undoManager]; 
    // Grab the old value of the key 
    id oldValue = [change objectForKey:NSKeyValueChangeOldKey]; 
    // Add edit item to the undo stack 
    [[undo prepareWithInvocationTarget:self] changeKeyPath:keyPath 
                ofObject:object 
                toValue:oldValue]; 
    // Set the undo action name in the menu 
    [undo setActionName:@"Edit"]; 
} 

peut être utilisé pour observer les changements dans les propriétés, la création NSInvocations inverse qui annule les modifications apportées à ces propriétés.

Les données de base ne sont pas nécessaires pour annuler, mais cela le rend beaucoup plus facile. Il gère pour vous la création de ces actions d'annulation chaque fois que vous modifiez votre modèle de données, y compris des actions complexes telles qu'une suppression en cascade dans une hiérarchie d'objets gérés.

Sur l'iPhone, pour activer l'annulation/la reprise, vous devez configurer quelques éléments. Tout d'abord, NSManagedObjectContexts sur l'iPhone ne disposent pas d'un gestionnaire d'annulation par défaut, vous devez créer un:

NSUndoManager *contextUndoManager = [[NSUndoManager alloc] init]; 
[contextUndoManager setLevelsOfUndo:10]; 
[managedObjectContext setUndoManager:contextUndoManager]; 
[contextUndoManager release];  

Ce code généralement aller juste après où vous avez créé votre NSManagedObjectContext. Une fois qu'un gestionnaire d'annulation est fourni pour votre contexte, vous devez activer le geste par défaut pour annuler sur l'iPhone, un tremblement de l'appareil. Pour que votre application gère ce geste automatiquement, placez le code suivant dans la méthode -applicationDidFinishLaunching: dans votre délégué de l'application:

application.applicationSupportsShakeToEdit = YES; 

Enfin, vous aurez besoin de configurer chaque contrôleur de vue qui sera capable de gérer le geste de secouer pour annuler. Ces contrôleurs de vue devront faire rapport le gestionnaire de undo à utiliser pour ce contrôleur en redéfinissant la méthode -undoManager:

- (NSUndoManager *)undoManager; 
{ 
    return [[[MyDatabaseController sharedDatabaseController] scratchpadContext] undoManager]; 
} 

La vue des contrôleurs devront également être en mesure de devenir le premier répondeur pour gérer les gestes, de sorte que les éléments suivants la méthode est nécessaire:

- (BOOL)canBecomeFirstResponder 
{ 
    return YES; 
} 

Le contrôleur de vue devra devenir le premier répondeur lorsqu'il apparaît à l'écran. Cela peut être fait en appelant [self becomeFirstResponder] dans -loadView ou -viewDidLoad, mais j'ai trouvé que les contrôleurs de vue qui apparaissent à l'écran immédiatement après le lancement doivent avoir ce message retardé un peu pour que cela fonctionne:

[self performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.3]; 

Avec tout cela en place, vous devriez obtenir l'annulation et le rétablissement automatique du support grâce à Core Data, avec un joli menu animé.