web-dev-qa-db-fra.com

Détection du défilement UITableView

J'ai sous-classé UITableView (en tant que KRTableView) et implémenté les quatre méthodes tactiles (touchesBegan, touchesEnded, touchesMoved et touchesCancelled) afin que je puisse détecter quand un événement tactile est géré sur une UITableView. Essentiellement, ce que je dois détecter, c'est lorsque l'UITableView défile vers le haut ou vers le bas.

Cependant, le sous-classement d'UITableView et la création des méthodes ci-dessus ne détectent que le défilement ou le mouvement des doigts dans une UITableViewCell, pas sur l'intégralité de UITableView.

Dès que mon doigt est déplacé vers la cellule suivante, les événements tactiles ne font rien.

Voici comment je sous-classe UITableView:

#import "KRTableView.h"


@implementation KRTableView

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];   
    NSLog(@"touches began...");
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];
  NSLog(@"touchesMoved occured");   
}

- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
  NSLog(@"touchesCancelled occured");   
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  [super touchesEnded:touches withEvent:event];
  NSLog(@"A tap was detected on KRTableView");
}

@end

Comment détecter quand UITableView défile vers le haut ou vers le bas?

56
Kishyr Ramdial

Vous n'avez pas besoin d'intercepter les méthodes d'événement. Vérifiez la documentation du protocole UIScrollViewDelegate et implémentez le -scrollViewDidScroll: ou -scrollViewWillBeginDragging: méthodes adaptées à votre situation.

143
NSResponder

Je voudrais ajouter ce qui suit:

Si vous travaillez avec un UITableView, il est probable que vous implémentiez déjà le UITableViewDelegate pour remplir le tableau de données.

Le protocole UITableViewDelegate est conforme à UIScrollViewDelegate, donc tout ce que vous avez à faire est d'implémenter les méthodes -scrollViewWillBeginDragging et -scrollViewDidScroll directement dans votre implémentation UITableViewDelegate et ils seront appelés automatiquement si la classe d'implémentation est définie comme déléguée à votre UITableView.

Si vous souhaitez également intercepter les clics dans votre table et pas seulement faire glisser et faire défiler, vous pouvez étendre et implémenter votre propre UITableViewCell et utiliser les méthodes touchesBegan:. En combinant ces deux méthodes, vous devriez pouvoir faire la plupart des choses dont vous avez besoin lorsque l'utilisateur interagit avec UITableView.

38
jake_hetfield

C'était mon erreur, j'ai essayé d'appeler la méthode avant de recharger la table. Le code suivant m'a aidé à résoudre ce problème.

[mytableview reloadData];

[mytableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:btn.tag-1] atScrollPosition:UITableViewScrollPositionTop animated:YES];

1
Nassif