Domanda

La mia app non utilizza ancora Core Data. E 'vero che I deve utilizzare Core Data per undo / redo?

E: In che modo l'utente fare l'undo / redo? Non ho mai visto in azione, e mai e poi mai usato. Non so come dovrei farlo se volevo. Non c'è nessun tasto undo / redo ovunque. Eppure si dice che ha undo / redo. Così come fa l'utente innescare questo?

È stato utile?

Soluzione

iPhone OS 3.0 ha portato oltre il concetto di NSUndoManager dal Mac, che è ciò che permette di annullare su iPhone. NSUndoManager mantiene una pila di NSInvocations quali sono le azioni opposte a qualsiasi modifica o altre modifiche apportate. Ad esempio,

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

può essere utilizzato per osservare i cambiamenti nelle proprietà, creando NSInvocations inversi che annullare modifiche a queste proprietà.

Core Data non è necessario per annullamento, ma rende molto, molto più facile. Gestisce la creazione di queste azioni di annullamento per voi ogni volta che si modifica il modello di dati, tra cui azioni complesse, come una cascata eliminare una gerarchia di oggetti gestiti.

Su iPhone, per consentire undo / redo, è necessario impostare un paio di cose. In primo luogo, NSManagedObjectContexts su iPhone non hanno un gestore di annullamento per impostazione predefinita, quindi è necessario crearne uno:

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

Questo codice viene in genere andare a destra dopo in cui si sarebbe creato il NSManagedObjectContext.

Una volta che un gestore di annullamento è previsto per il contesto, è necessario abilitare il gesto di default per la funzione Undo su iPhone, una scossa del dispositivo. Per consentire l'applicazione di gestire automaticamente questo gesto, inserire il seguente codice all'interno del metodo -applicationDidFinishLaunching: nella vostra delegato applicazione:

application.applicationSupportsShakeToEdit = YES;

Infine, è necessario configurare ciascun controller della vista che sarà in grado di gestire lo scuotimento per annullamento. Questi controller di vista dovranno riferire il manager di annullamento da utilizzare per tale controller eseguendo l'override del metodo -undoManager:

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

I controller di vista dovranno anche essere in grado di diventare il primo risponditore per gestire gesti, quindi è necessario il seguente metodo:

- (BOOL)canBecomeFirstResponder 
{
    return YES;
}

Il controller della vista avrà bisogno di diventare il primo risponditore quando appare sullo schermo. Questo può essere fatto chiamando [self becomeFirstResponder] in -loadView o -viewDidLoad, ma ho scoperto che vista controllori che appaiono sullo schermo subito dopo il lancio bisogno di avere questo messaggio ritardato un po 'in ordine per farlo funzionare:

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

Con tutto questo in luogo, si dovrebbe ottenere undo e redo automatica supporto per gentile concessione di Core Data, con un bel menu animati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top