问题
I have a list of numbers in a table view like this.
As you can see the numbers are repeated. Let's consider a set of repeated numbers as a group. So there are group of 1s, group of 2s and so on.
What I want to do is when the app starts, I need to scroll to the start position of a specified group automatically. Before explaining further, here is my code so far.
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
}
}
}
}
I've assigned the value 12 for the variable groupNoToScroll
. This means when the app starts I want the table view to be auto scrolled to the start of the cells of the 12s group.
But currently what my code does is scroll to the 12th cell, not the cell that has the value 12. My question is how can I check with the cells' values and scroll to the number which I specify?
回答1:
You can use find the index of the item(which will be its row), and then scroll to that index. find
function returns the index of a particular element in the array.
if let index = find(items, groupNoToScroll)
{
let indexPath = NSIndexPath(forRow: index, inSection: 0)
tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}
回答2:
Swift 4:
let indexPath = IndexPath(row: row, section: section)
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
(first, of course, you have to assign values to row and section based on which cell you want to scroll to)
回答3:
Swift 3.0
let indexPath = NSIndexPath(forRow: 5, inSection: 0)
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
Swift 4.0
let lastRowIndex = self.tblRequestStatus!.numberOfRows(inSection: 0) - 1
let pathToLastRow = IndexPath.init(row: lastRowIndex, section: 0)
tableView.scrollToRow(at: pathToLastRow, at: .none, animated: false)
回答4:
Do this to find the first element in the array that is equal to groupNoToScroll. Then, go to that row.
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)
}
}
But I would recommend doing this in viewDidAppear.
As Isuru pointed out rather use the find function.
来源:https://stackoverflow.com/questions/28043632/auto-scrolling-to-a-cell-with-a-specific-value