Existe-t-il un moyen de déclencher un événement, comme avec un IBAction
, lorsqu'un utilisateur fait défiler vers le bas d'un UITableView
? J'aimerais ajouter plus de lignes si cela se produit. Comment puis-je faire cela?
Écoutez simplement le scrollViewDidScroll:
méthode déléguée, comparez l'offset de contenu avec l'offset possible actuel et s'il est inférieur, un certain seuil appelle votre méthode pour mettre à jour la vue de table. N'oubliez pas d'appeler [tableView reloadData]
pour vous assurer qu'il recharge les données nouvellement ajoutées.
EDIT: Mettre en place le code abstrait, pas sûr si cela fonctionne, mais devrait.
- (void)scrollViewDidScroll: (UIScrollView *)scroll {
// UITableView only moves in one direction, y axis
CGFloat currentOffset = scroll.contentOffset.y;
CGFloat maximumOffset = scroll.contentSize.height - scroll.frame.size.height;
// Change 10.0 to adjust the distance from bottom
if (maximumOffset - currentOffset <= 10.0) {
[self methodThatAddsDataAndReloadsTableView];
}
}
Sauf s'il est un peu tard, mais je pense avoir trouvé une meilleure solution:
au lieu de
- (void)scrollViewDidScroll: (UIScrollView)scroll
j'ai utilisé
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
C'est beaucoup plus pratique, car l'événement n'est déclenché qu'une seule fois. J'ai utilisé ce code dans mon application pour charger plus de lignes dans ma table en bas (peut-être reconnaissez-vous ce type de rechargement à partir de l'application facebook - seule différence qu'ils mettent à jour en haut).
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
if (maximumOffset - currentOffset <= -40) {
NSLog(@"reload");
}
}
J'espère que quelqu'un vous aidera.
J'utilise cet extrait. dans tableView:willDisplayCell:forRowAtIndexPath:
Je vérifie si la cellule avec le dernier chemin d'index est sur le point d'être affichée.
Pour une tableView avec une section:
[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0]
avec plus de sections:
[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:[self numberOfSectionsInTableView:self.tableView]-1]
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if(!_noMoreDataAvailable)
{
if ([indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0]])
{
[self.dataSourceController fetchNewData];
}
}
}
après avoir récupéré le dataSourceController informera le délégué tableView et cela rechargera les données.
Cela peut être réalisé de manière beaucoup plus simple, je suppose, il vous suffit de déterminer la direction de défilement, comme dans ce cas, c'est lorsque l'utilisateur fait défiler vers le bas.
Tout d'abord dans votre fichier .h, déclarez une variable:
CGPoint pointNow;
Dans le fichier .m, dans la méthode scrollViewDidScroll, nous devons implémenter ce code: -
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y > pointNow.y) {
//Enter code here
}
}
Voici la version Swift de @ user944351's answer :
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
let currentOffset = scrollView.contentOffset.y
let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height
if maximumOffset - currentOffset <= -40 {
print("reload")
}
}
Ajoutez simplement cette méthode à votre classe déléguée UITableView
. J'ai trouvé -40
trop grand mais vous pouvez l'ajuster en fonction de vos besoins.
NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
// Hit Bottom?
if ((currentOffset > 0) && (maximumOffset - currentOffset) <= 10) {
// Hit Bottom !!
}
Je ne sais pas pourquoi vous voudriez faire cela, mais j'imagine que vous pourriez ajouter du code à votre méthode cellForRowAtIndexPath
de sorte que si indexPath.row == la dernière ligne, appelez la méthode pour ajouter plus de lignes ...