J'ai une liste de nombres dans une vue de table comme celle-ci.
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?
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)
}
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)
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)
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.