自动滚动到具有特定值的单元格
Auto scrolling to a cell with a specific value
我在这样的 table 视图中有一个数字列表。
如您所见,数字是重复的。让我们将一组重复的数字视为一个组。所以有1组,2组等等。
我想做的是当应用程序启动时,我需要自动滚动到指定组的开始位置。在进一步解释之前,这是我到目前为止的代码。
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
}
}
}
}
我已经为变量 groupNoToScroll
分配了值 12。这意味着当应用程序启动时,我希望 table 视图自动滚动到 12s 组单元格的开头。
但目前我的代码所做的是滚动到第 12 个单元格,而不是具有 值 12 的单元格。我的问题是如何检查单元格的值和滚动到我指定的号码?
执行此操作以找到数组中等于 groupNoToScroll 的第一个元素。然后,转到那一行。
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)
}
}
但我建议在 viewDidAppear 中这样做。
正如 Isuru 指出的那样,最好使用查找功能。
您可以使用查找项目的索引(这将是它的行),然后滚动到该索引。
find
函数 returns 数组中特定元素的索引。
if let index = find(items, groupNoToScroll)
{
let indexPath = NSIndexPath(forRow: index, inSection: 0)
tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}
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)
Swift 4:
let indexPath = IndexPath(row: row, section: section)
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
(首先,当然,您必须根据要滚动到的单元格为行和部分分配值)
我在这样的 table 视图中有一个数字列表。
如您所见,数字是重复的。让我们将一组重复的数字视为一个组。所以有1组,2组等等。
我想做的是当应用程序启动时,我需要自动滚动到指定组的开始位置。在进一步解释之前,这是我到目前为止的代码。
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
}
}
}
}
我已经为变量 groupNoToScroll
分配了值 12。这意味着当应用程序启动时,我希望 table 视图自动滚动到 12s 组单元格的开头。
但目前我的代码所做的是滚动到第 12 个单元格,而不是具有 值 12 的单元格。我的问题是如何检查单元格的值和滚动到我指定的号码?
执行此操作以找到数组中等于 groupNoToScroll 的第一个元素。然后,转到那一行。
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)
}
}
但我建议在 viewDidAppear 中这样做。
正如 Isuru 指出的那样,最好使用查找功能。
您可以使用查找项目的索引(这将是它的行),然后滚动到该索引。
find
函数 returns 数组中特定元素的索引。
if let index = find(items, groupNoToScroll)
{
let indexPath = NSIndexPath(forRow: index, inSection: 0)
tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
}
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)
Swift 4:
let indexPath = IndexPath(row: row, section: section)
tableView.scrollToRow(at: indexPath, at: .top, animated: true)
(首先,当然,您必须根据要滚动到的单元格为行和部分分配值)