Pergunta

Meu aplicativo ainda não usa dados principais. É verdade que eu devo usar dados principais para desfazer/refazer?

E: como o usuário faz o desfazer/refazer? Eu nunca vi isso em ação e nunca o usei. Não sei como devo fazer isso se quisesse. Não há botão de desfazer/refazer em nenhum lugar. No entanto, eles dizem que ele desfazer/refazer. Então, como o usuário aciona isso?

Foi útil?

Solução

O iPhone OS 3.0 trouxe o conceito de Nsundomanager do Mac, que é o que permite desfazer no iPhone. O Nsundomanager mantém uma pilha de nsinvocations, que são as ações opostas a quaisquer edições ou outras alterações que você faça. Por exemplo,

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

pode ser usado para observar alterações nas propriedades, criando nsinvocações inversas que desfazerão edições a essas propriedades.

Os dados principais não são necessários para desfazer, mas facilita muito, muito mais fácil. Ele lida com a criação dessas ações de desfazer para você toda vez que você edita seu modelo de dados, incluindo ações complexas, como uma exclusão em cascata, uma hierarquia de objetos gerenciados.

No iPhone, para ativar o desfazer / refazer, você precisa configurar algumas coisas. Primeiro, o NSmanAgedObjectContexts no iPhone não tem um gerente de desfazer por padrão, então você precisa criar um:

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

Esse código normalmente iria logo depois de onde você teria criado seu NSmanAgedObjectContext.

Depois que um gerente de desfazer é fornecido para o seu contexto, você precisa ativar o gesto padrão para desfazer no iPhone, um sacudido do dispositivo. Para deixar seu aplicativo lidar com este gesto automaticamente, coloque o seguinte código dentro do -applicationDidFinishLaunching: Método em seu delegado de aplicativo:

application.applicationSupportsShakeToEdit = YES;

Por fim, você precisará configurar cada controlador de exibição que será capaz de lidar com o gesto de shake para desfazer. Esses controladores de visualização precisarão relatar o gerente de desfazer para usar para esse controlador, substituindo o -undoManager método:

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

Os controladores de visualização também precisarão ser capazes de se tornar o primeiro respondedor para lidar com gestos, para que seja necessário o seguinte método:

- (BOOL)canBecomeFirstResponder 
{
    return YES;
}

O controlador de exibição precisará se tornar o primeiro respondedor quando aparecer na tela. Isso pode ser feito ligando [self becomeFirstResponder] dentro -loadView ou -viewDidLoad, mas descobri que os controladores de exibição que aparecem na tela imediatamente após o lançamento precisam ter essa mensagem atrasada um pouco para que funcione:

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

Com tudo isso em vigor, você deve obter o suporte automático e refazer o suporte à cortesia dos dados principais, com um bom menu animado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top