web-dev-qa-db-fra.com

Ajouter des lignes à UITableView en faisant défiler vers le bas

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?

30
aherlambang

É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];
     }
}
38
Henri Normak

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.

57
user944351

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.

13
vikingosegundo

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
    }
}
1
Jas_meet

Swift

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.

Plus d'informations

  • Voir ma réponse plus complète qui a un exemple de méthode pour recharger les données en utilisant des limites et des décalages pour la base de données.
1
Suragch
NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;

// Hit Bottom?
if ((currentOffset > 0) && (maximumOffset - currentOffset) <= 10) {
   // Hit Bottom !! 
}
1
bi Park

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 ...

0
rekle