立即将tableView滚动到indexPath

时间:2015-08-31 08:35:05

标签: ios swift uitableview scroll

我必须在屏幕出现后立即将tableView滚动到indexPath。这是我尝试过的,但它在开始时并没有起作用。它仅在tableView加载时起作用,然后我按下一个滚动tableView的按钮。

func scrollTableViewToCell() {
    let indexPath = NSIndexPath(forItem: 8, inSection: 1)
    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Middle, animated: true)
}

我也试过了,但它并没有按照我的需要运作:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    println(indexPath)
    println(NSIndexPath(forRow: tableView.indexPathsForVisibleRows()!.last!.row, inSection: 2))
    if indexPath == NSIndexPath(forRow: tableView.indexPathsForVisibleRows()!.last!.row, inSection: 0) {
        scrollTableViewToCell()
    }
}

我也试过这个)

override func viewDidLayoutSubviews() {
    self.view.layoutIfNeeded()
    scrollTableViewToCell()
}

有人可以告诉我如何知道tableView何时加载了所有单元格,然后将其滚动到 NSIndexPath(forItem:8,inSection:1)

UPDATE ::

以下是我如何将数据加载到tableView:

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return years.count
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return allInfo[years[section]]!.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("tutionTableViewCell") as! TuitionTableViewCell
    cell.selectionStyle = .None

    let info = allInfo[years[indexPath.section]]! as [String: String?]

    cell.monthLabel.text = months[indexPath.row]
    if info[months[indexPath.row]]! != nil {
        cell.tuitionLabel.hidden = false
        cell.tuitionLabel.text = info[months[indexPath.row]]!
    } else {
        cell.tuitionLabel.hidden = true
    }
    if info[months[indexPath.row]]! == "Nog te betalen" {
        cell.monthLabel.textColor = UIColor(hex: 0xff0000).colorWithAlphaComponent(0.87)
        cell.tuitionLabel.textColor = UIColor(hex: 0xff0000).colorWithAlphaComponent(0.87)
    } else {
        cell.monthLabel.textColor = UIColor.blackColor().colorWithAlphaComponent(0.87)
        cell.tuitionLabel.textColor = UIColor.blackColor().colorWithAlphaComponent(0.87)
    }
    return cell
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return years[section]
}

func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    let header: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView
    header.textLabel.font = UIFont(name: "Roboto-Regular", size: 16)
    header.textLabel.text = self.tableView(self.tableView, titleForHeaderInSection: section)
    let headerFrame = header.frame
    header.textLabel.frame = headerFrame
    header.textLabel.textColor = UIColor.blackColor().colorWithAlphaComponent(0.54)
    header.textLabel.backgroundColor = UIColor(hex: 0xf9f9f9)
    header.contentView.backgroundColor = UIColor(hex: 0xf9f9f9)
}

func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 35
}

第二次更新::

我的硬编码数据:

var years: [String] = ["2015", "2016", "2017"]
var months: [String] = ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"]
var allInfo: [String: [String: String?]] = [String: [String: String?]]()

override func viewDidLoad() {
    self.tableView.separatorStyle = .None
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.estimatedRowHeight = 150.0

    allInfo[years[0]] = ["Januari": "300,00", "Februari": "300,00", "Maart": "300,00", "April": "300,00", "Mei": "300,00", "Juni": "300,00", "Juli": "300,00", "Augustus": "300,00", "September": "300,00", "Oktober": "300,00", "November": "300,00", "December": "300,00"]
    allInfo[years[1]] = ["Januari": "300,00", "Februari": "300,00", "Maart": "300,00", "April": "300,00", "Mei": "300,00", "Juni": "300,00", "Juli": "300,00", "Augustus": "300,00", "September": "Nog te betalen", "Oktober": nil, "November": nil, "December": nil]
    allInfo[years[2]] = ["Januari": nil, "Februari": nil, "Maart": nil, "April": nil, "Mei": nil, "Juni": nil, "Juli": nil, "Augustus": nil, "September": nil, "Oktober": nil, "November": nil, "December": nil]

    tableView.reloadData()
    scrollTableViewToCell()
}

3 个答案:

答案 0 :(得分:1)

在viewdidload中设置一个计时器。这样可以解决您的问题。

    Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ViewController.scrollToRowMethod), userInfo: nil, repeats: false)

答案 1 :(得分:0)

确保您已实施方法estimatedHeightForRowAtIndexPath -

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 44
}

当您将tableview直接滚动到一个从未渲染过的单元格下方的行时,如果不知道“缺失”单元格的大小,则tableview无法正确布置单元格。

在我的测试应用中实现此方法解决了滚动问题以及当我向上滚动时看到的奇怪的“轻弹”。

另外,您应该在super.viewDidLoad()方法

中致电viewDidLoad

答案 2 :(得分:0)

非常感谢@ Paulw11帮助解决了我的问题。

我通过在viewDidLoad中删除这两行代码来解决它:

hh:mm:ss dd:mm:yyyy

现在它根据需要滚动!

此外,通过添加滚动动画删除了滚动延迟:

self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 150.0