2011-08-26 13 views
16

¿Cómo puedo saber cuándo se ha completado [UITableView setEditing: YES animated: YES]?¿Cómo puedo saber cuándo ha terminado una animación UITableView?

No quiero dar ningún contexto, porque quiero evitar que alguien me proporcione soluciones alternativas, que no me interesan.

Lo que quiero es llamar a lo anterior, luego tener una función separada llamada cuando se completa la animación.


Me han editado la publicación para dar contexto y algunas soluciones. Originalmente establecí Edición e inmediatamente recargué los datos de la tabla.

[tableView setEditing:YES animated:YES]; 
[tableView reloadData]; 

El problema es que la tabla vuelve a cargarse antes de que comience la animación, por lo que nunca se ve la animación.

Estas son algunas diversas soluciones:

[tableView setEditing:YES animated:YES]; 
[self performSelector:@selector(ReloadTable) withObject:nil afterDelay:1.0]; 

Esto funciona, pero si consigo el retraso incorrecta, que se verá mal. De modo que necesito saber cuál es la demora, lo cual puedo averiguar, pero no estamos seguros de que la demora siempre sea la misma.

isEditing = YES; 
[tableView reloadData]; 
[tableView setEditing:YES animated:YES]; 

esto podría funcionar, pero la mesa se comporta de manera diferente dependiendo de si estamos en modo de edición. Así que tengo que usar mi propia variable isEditing en lugar de la UITableView.editing estándar. Preferiría no tener que crear una nueva variable booleana isEditing.

[tableView setEditing:YES animated:YES]; 
[tableView insertRowsAtIndexPaths:path withRowAnimation:UITableViewRowAnimationTop]; 

Esto casi funciona bien, pero en el modo de edición de la primera fila debe tener la UITableViewCellEditingStyleInsert, mientras que las otras filas consiguen UITableViewCellEditingStyleDelete. Y con el código anterior, el estilo de edición se establece ANTES de agregar la fila. Por lo tanto, la segunda fila termina con UITableViewCellEditingStyleInsert.

Respuesta

46
[CATransaction begin]; 
[CATransaction setCompletionBlock: ^{ 
    // your animation has finished 
}]; 
[tableView setEditing:YES animated:YES]; 
[CATransaction commit]; 

Tenga en cuenta que setCompletionBlock debe estar en la parte superior.

+2

+1 Esto funcionó * perfectamente *. – Isaac

+2

He intentado muchas de las sugerencias en otros hilos sobre este problema, ¡y esta es la primera que funcionó! – Marty

+0

¡Qué gran respuesta! – Swindler

3

En iOS 4 se puede hacer lo siguiente:

[UIView animateWithDuration:0.3f 
       animations:^{ 
        [self.tableView setEditing:YES animated:NO]; 
       } 
       completion:^(BOOL finished){ 
        // Do something 
       } 
]; 
+0

Esto funciona bien (1), pero el 'sugerencia CATransaction' en otra respuesta funcionaban mejor. – Isaac

+0

Esto depende del tiempo que Apple elija para la animación. Si cambian el tiempo en una versión futura, entonces esto no funcionará más. Vea la respuesta aceptada para una mejor manera. – fishinear

1

Swift versión 4 de respuesta aceptada:

CATransaction.begin() 
CATransaction.setCompletionBlock { 
    // your animation has finished 
} 
tableView.setEditing(true, animated: true) 
CATransaction.commit() 
Cuestiones relacionadas