2011-08-26 3 views
16

Comment puis-je savoir quand [UITableView setEditing: YES animated: YES] est terminé?Comment puis-je savoir quand une animation UITableView est terminée?

Je ne veux pas donner de contexte, parce que je veux éviter que quelqu'un me donne des solutions de contournement qui ne m'intéressent pas. Ce que je veux est d'appeler ce qui précède, puis avoir une fonction distincte appelée lorsque l'animation est terminée.


Je suis édité le post pour donner un contexte et quelques solutions de contournement. À l'origine, j'ai défini SetEditing et rechargé immédiatement les données de la table.

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

Le problème est que la table rechargements avant que l'animation commence, et ainsi de l'animation est jamais vu.

Voici quelques solutions de contournement différentes:

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

Cela fonctionne, mais si je reçois le retard incorrect, alors il fera mauvais. J'ai donc besoin de savoir quel est le délai, ce que je peux comprendre, mais nous ne sommes pas assurés que le délai sera toujours le même.

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

Cela pourrait fonctionner, mais la table se comporte différemment selon que nous sommes en mode d'édition. Je dois donc utiliser ma propre variable isEditing au lieu de la norme UITableView.editing. Je préférerais ne pas avoir à créer une nouvelle variable isEditing booléenne.

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

Cela fonctionne presque bien, mais en mode d'édition de la première ligne devrait avoir le UITableViewCellEditingStyleInsert, tandis que les autres lignes se UITableViewCellEditingStyleDelete. Et avec le code ci-dessus, le style d'édition est défini AVANT que la ligne ne soit ajoutée. Par conséquent, la deuxième ligne se termine par UITableViewCellEditingStyleInsert.

Répondre

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

Notez que setCompletionBlock doit être sur le dessus.

+2

+1 Cela a fonctionné * parfaitement *. – Isaac

+2

J'ai essayé beaucoup de suggestions sur d'autres threads à propos de ce problème, et c'est le premier qui a fonctionné! – Marty

+0

Quelle bonne réponse! – Swindler

3

Dans iOS 4, vous pouvez effectuer les opérations suivantes:

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

Cela fonctionne bien (+1), mais la suggestion 'CATransaction' dans une autre réponse a mieux fonctionné. – Isaac

+0

Cela dépend du moment choisi par Apple pour l'animation. Si elles changent le timing dans une prochaine version, cela ne fonctionnera plus. Voir la réponse acceptée pour une meilleure façon. – fishinear

1

Swift 4 version de réponse acceptée:

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