Pourquoi la suppression par balayage de UITableView fonctionne-t-elle parfois bien et parfois non?

Il y a un UITableView sur ma vue, je veux appliquer des lignes de balayage-suppression-mode d'une certaine section. Ce que j'ai implémenté est le suivant:

  - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@">> canEditRowAtIndexPath"); if (indexPath.section == CanDeletedSection) { return YES; }else{ return NO; } } - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@">> editingStyleForRowAtIndexPath"); if (indexPath.section == CanDeletedSection) { return UITableViewCellEditingStyleDelete; } return UITableViewCellEditingStyleNone; } - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@">> commitEditingStyle"); if (editingStyle == UITableViewCellEditingStyleDelete) { // dosomething } } 

Mais lorsque je balaye la ligne du tableau, parfois le button Delete apparaît, parfois non. Incidemment, ma cellule est personnalisée et hérite de UITableViewCell .

J'ai ajouté le NSLog aux methods ci-dessus. Lorsque le button Delete n'apparaît pas dans le journal, j'ai comme ceci:

 >> editingStyleForRowAtIndexPath >> canEditRowAtIndexPath 

Lorsque le button Delete apparaît, le journal comme ci-dessous:

 >> editingStyleForRowAtIndexPath >> canEditRowAtIndexPath >> editingStyleForRowAtIndexPath >> canEditRowAtIndexPath >> canEditRowAtIndexPath >> editingStyleForRowAtIndexPath 

J'ai fait une démo en utilisant la cellule personnalisée, ça marche bien. Les problèmes sont donc causés par le controller de vue qui contient la vue de la table. Le controller de vue hérite d'un autre controller de vue, dans ce controller de vue, il y a un geste de tapement qui sert à cacher le keyboard. Mais quand je les ai retirés du controller de vue, le résultat est le même.

Veuillez vérifier si la vue ou le survol a d'autres gestes. Si c'est le cas, assurez-vous que vous implémentez la méthode ci-dessous de UIGestureRecognizerDelegate après avoir défini le délégué de geste:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } 

Parfois, en particulier dans le simulateur, il est difficile d'effectuer le balayage correctement. Vous findez que c'est probablement un problème physique , pas un problème de encoding.

En outre, vous pouvez vérifier si votre cellule personnalisée ne contient pas un élément qui intercepte le balayage et ne le transmet pas à la cellule.

J'ai aussi fait face à ce même problème … Mais finalement j'ai eu la solution par: –

Exemple:-
self.navigationController.interactivePopGestureRecognizer.enabled = NO;

Vous devez désactiver tout autre geste dans cette vue particulière si vous utilisez "commitcommitingitingstyle".

J'espère que ceci vous aidera… 🙂

Les identificateurs de mouvement situés ailleurs dans la hiérarchie de vue peuvent intercepter et bloquer l'action de balayage.

Je l'ai résolu avec cette catégorie dans le controller de vue:

 @interface UIView (CellSwipeAdditions) - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; @end @implementation UIView (CellSwipeAdditions) - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } @end 

Merci à Bademi pour m'avoir conduit à cette solution!