web-dev-qa-db-fra.com

Défilement automatique vers une cellule avec une valeur spécifique

J'ai une liste de nombres dans une vue de table comme celle-ci.

enter image description here

Comme vous pouvez le voir, les chiffres sont répétés. Considérons un ensemble de nombres répétés comme un groupe . Il y a donc un groupe de 1, un groupe de 2 et ainsi de suite.

Ce que je veux faire, c'est quand l'application démarre, je dois faire défiler jusqu'à la position de départ d'un groupe spécifié automatiquement. Avant d'expliquer davantage, voici mon code jusqu'à présent.

import UIKit

class TableViewController: UITableViewController, UITableViewDataSource, UITableViewDelegate {

    private var scrollToTime = true
    private var items = [Int]()
    private var groupNoToScroll = 12

    override func viewDidLoad() {
        super.viewDidLoad()

        items = [1, 1, 2, 2, 2, 3, 4, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 14, 14, 14, 14, 15, 15, 16, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 21, 22, 22, 23, 23, 23]
    }

    // MARK: - UITableViewDataSource
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
        cell.textLabel?.text = String(items[indexPath.row])

        return cell
    }

    // MARK: - UITableViewDelegate
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

        let lastRow = tableView.indexPathsForVisibleRows()?.last as NSIndexPath
        if indexPath.row == lastRow.row {
            if scrollToTime == true {
                let indexPath = NSIndexPath(forRow: groupNoToScroll, inSection: 0)
                tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
                scrollToTime = false
            }
        }
    }
}

J'ai attribué la valeur 12 à la variable groupNoToScroll. Cela signifie que lorsque l'application démarre, je veux que la vue de la table défile automatiquement jusqu'au début des cellules du groupe 12s.

Mais actuellement, mon code fait défiler jusqu'à la 12e cellule, pas la cellule qui a le valeur 12. Ma question est de savoir comment puis-je vérifier avec les valeurs des cellules et faire défiler jusqu'au nombre que je spécifie?

15
Isuru

Vous pouvez utiliser l'index de l'élément (qui sera sa ligne), puis faire défiler jusqu'à cet index.
La fonction find renvoie l'index d'un élément particulier du tableau.

if let index = find(items, groupNoToScroll)
{
    let indexPath = NSIndexPath(forRow: index, inSection: 0)
    tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}
31
rakeshbs

Swift 4:

let indexPath = IndexPath(row: row, section: section)
tableView.scrollToRow(at: indexPath, at: .top, animated: true)

(d'abord, bien sûr, vous devez attribuer des valeurs à la ligne et à la section en fonction de la cellule à laquelle vous souhaitez faire défiler)

13
Gefilte Fish

Swift 3.

 let indexPath = NSIndexPath(forRow: 5, inSection: 0)
 tableView.scrollToRow(at: indexPath, at: .top, animated: true)

Swift 4.

let lastRowIndex = self.tblRequestStatus!.numberOfRows(inSection: 0) - 1
let pathToLastRow = IndexPath.init(row: lastRowIndex, section: 0)
tableView.scrollToRow(at: pathToLastRow, at: .none, animated: false)
11
Harshil Kotecha

Effectuez cette opération pour rechercher le premier élément du tableau qui est égal à groupNoToScroll. Ensuite, allez à cette ligne.

    var rowToGoTo:Int = 0 //Rather use the Swift find function.
    for x in items{
        if x == groupNoToScroll{
            break
        }
        rowToGoTo++
    }

    let lastRow = tableView.indexPathsForVisibleRows()?.last as NSIndexPath
    if indexPath.row == lastRow.row {
        if scrollToTime == true {
           let indexPath = NSIndexPath(row: rowToGoTo, section: 0)
           tblBusList.scrollToRow(at: indexPath as IndexPath, at: .top, animated: true)
        }
    }

Mais je recommanderais de le faire dans viewDidAppear.

Comme l'a souligné Isuru, utilisez plutôt la fonction find.

2
Petri Oosthuizen