web-dev-qa-db-fra.com

Détecter la cellule supérieure actuelle dans UITableView après le défilement

une question simple mais je ne semble pas avoir la bonne terminologie pour rechercher Stackoverflow par elle.

J'ai une UITableView sans sections, l'utilisateur peut faire défiler vers le haut et vers le bas une longue liste de données (lignes) présentées dans cette table.

Question: comment puis-je détecter le plus grand nombre de lignes de cellules après le défilement de l'utilisateur. (par exemple, si l'utilisateur fait défiler 30 cellules vers le bas, la cellule supérieure après le défilement est = 30)

38
chewy

Vous pouvez essayer d'utiliser le UITableView-indexPathsForVisibleRows ou -indexPathForRowAtPoint.

Par exemple, disons que vous souhaitez imprimer l'indexPath de la cellule visible la plus haute, lorsque vous arrêtez de faire glisser votre tableau. Vous pouvez faire quelque chose comme ça:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
    NSLog(@"first visible cell's section: %i, row: %i", firstVisibleIndexPath.section, firstVisibleIndexPath.row);
}

Pour Swift 3.0

let topVisibleIndexPath:IndexPath = self.tableView.indexPathsForVisibleRows![0]
71
phi

Vous obtenez les chemins d'index pour les lignes visibles

NSArray* indexPaths = [tableView indexPathsForVisibleRows];

Triez ensuite à l'aide de compare:

NSArray* sortedIndexPaths = [indexPaths sortedArrayUsingSelector:@selector(compare:)];

Obtenez ensuite la première ligne du premier élément

NSInteger row = [(NSIndexPath*)[sortedIndexPaths objectAtIndex:0] row];
31
jbat100

Voici le code Swift 3+:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    let firstVisibleIndexPath = self.tableView.indexPathsForVisibleRows?[0]
    print("First visible cell section=\(firstVisibleIndexPath?.section), and row=\(firstVisibleIndexPath?.row)")
}
8
mathema