web-dev-qa-db-ja.com

特定の値を持つセルまで自動スクロール

このようなテーブルビューに数値のリストがあります。

enter image description here

ご覧のとおり、数字は繰り返されています。繰り返し数のセットをgroupと見なしてみましょう。つまり、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を割り当てました。これは、アプリが起動したときに、テーブルビューを12秒グループのセルの先頭に自動スクロールすることを意味します。

しかし、現在のコードでは、 12のセルではなく、12番目のセルまでスクロールしています。私の質問は、セルの値を確認して、指定した数までスクロールする方法ですか。

15
Isuru

アイテムのインデックス(行になる)を見つけて、そのインデックスまでスクロールできます。
find関数は、配列内の特定の要素のインデックスを返します。

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

スウィフト4:

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

(もちろん、最初に、スクロールするセルに基づいて行とセクションに値を割り当てる必要があります)

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

これを実行して、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関数を使用します。

2