Pregunta

Mi aplicación no utiliza la base de datos todavía. ¿Es cierto que I debe utilizar datos básicos para deshacer / rehacer?

Y: ¿De qué manera el usuario haga el deshacer / rehacer? Nunca he visto en acción, y nunca lo utilizó. No sé cómo debo hacerlo si quería. No hay botón de deshacer / rehacer en cualquier lugar. Sin embargo, ellos dicen que se ha de deshacer / rehacer. Entonces, ¿cómo el usuario desencadena este?

¿Fue útil?

Solución

iPhone OS 3.0 trajo el concepto de NSUndoManager desde el Mac, que es lo que permite deshacer en el iPhone. NSUndoManager mantiene una pila de NSInvocations que son las acciones opuestas a las modificaciones o cambios que realice. Por ejemplo,

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

puede ser utilizada para observar los cambios en las propiedades, creando NSInvocations inversos que deshacer ediciones a esas propiedades.

Datos Básicos no es necesario para deshacer, sino que lo hace mucho, mucho más fácil. Se ocupa de la creación de estas acciones de deshacer para que cada vez que se edita el modelo de datos, incluyendo las acciones complejas como una eliminación en cascada abajo de una jerarquía de objetos gestionados.

En el iPhone, para permitir deshacer / rehacer, es necesario configurar algunas cosas. En primer lugar, NSManagedObjectContexts en el iPhone no tienen un administrador de deshacer por defecto, por lo que necesita para crear uno:

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

Este código suele ir justo después de donde usted ha creado su NSManagedObjectContext.

Una vez que se proporciona un gestor de deshacer para su contexto, es necesario tener el gesto predeterminado para deshacer en el iPhone, una sacudida del dispositivo. Para permitir que la aplicación manejar este gesto de forma automática, coloque el código siguiente en el método -applicationDidFinishLaunching: delegado en su aplicación:

application.applicationSupportsShakeToEdit = YES;

Por último, tendrá que configurar cada controlador de vista que será capaz de manejar el gesto de agitar para deshacer. Estos controladores de vista tendrán que informar undomanager a utilizar para que el controlador reemplazando el método -undoManager:

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

Los controladores de vista también tienen que ser capaces de convertirse en el primer nivel de respuesta para manejar gestos, por lo que se necesita el siguiente método:

- (BOOL)canBecomeFirstResponder 
{
    return YES;
}

El controlador de vista necesitará para convertirse en el primer nivel de respuesta cuando aparece en la pantalla. Esto se puede hacer llamando [self becomeFirstResponder] en -loadView o -viewDidLoad, pero he encontrado que los controladores de vista, que aparecen en la pantalla inmediatamente después de la puesta en marcha necesita tener este mensaje retrasó un poco con el fin de que funcione:

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

Con todo esto en su lugar, usted debe conseguir deshacer y rehacer automática apoyo cortesía de datos básicos, con un menú animado agradable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top