scrollToRow无法正确滚动

时间:2020-02-20 19:47:57

标签: swift uitableview

在我正在开发的应用中,我有一个带四个屏幕的标签栏控制器。
在每个选项卡式区域中,都有一个单独的Navigation Controller堆栈,用于与该应用程序的该部分有关的屏幕。
其中之一是“设置”部分,在这里我希望用户能够根据需要更改其位置。就像iPhone上的“设置”部分一样。

因此,我有一个国家列表-根据其首字母分组在各个部分中-以UITableView显示。选择了默认国家/地区,就像iPhone设置一样,我希望UITableView在该国家/地区首次出现时将其显示为第一行。

我目前将scrollToRow放在viewDidLoad中,如下所示:

override func viewDidLoad() {
    super.viewDidLoad()

    // Code to sort countries into sections and to find the correct initial country, index of which is store in selectedIndex

    self.tableView.layoutIfNeeded()
    self.tableView.scrollToRow(at: selectedIndex ?? IndexPath(row: 0, section: 0), at: .top, animated: false)
}

现在,如果初始国家/地区在列表的顶部,那么一切正常。但英国说,如果它位于底部附近,尽管能够进一步滚动,但它不会滚动到顶部,而只会滚动到顶部附近。几乎就像它忘记了标签栏一样,不会再滚动到更高的水平。当然,手动进行滚动就没有问题。 (我不确定如何在这篇文章中添加图片,因此也没有说明。)

几个月前,我在scrollToRow上遇到了另一个问题,并通过在调用tableView.layoutIfNeeded()之前插入scrollToRow来解决了这个问题,因此将其包含在此处。但这在这里不起作用。

我尝试按照我阅读的一篇文章中的建议,将对scrollToRow的调用放在viewDidAppear中,但是随后在“跳转”到正确的行之前,在不显示国家的情况下显示了表格。我希望屏幕打开时它在那里。

有人有什么想法吗?谢谢。

(我正在将Xcode 11.3用于iOS 11.0环境。)

1 个答案:

答案 0 :(得分:0)

您必须在 scrollToRow 之前添加一个检查

override func viewDidLoad() {
     super.viewDidLoad()
        
     // Code to sort countries into sections and to find the correct initial country, index of which is store in selectedIndex
        
    self.tableView.layoutIfNeeded()

    if tableView.numberOfSections >= selectedIndex.section
      ,tableView.numberOfRows(inSection: selectedIndex.section) >= selectedIndex.row {
           self.tableView.scrollToRow(at: selectedIndex, at: .top, animated: false)
    }
}