在我正在开发的应用中,我有一个带四个屏幕的标签栏控制器。
在每个选项卡式区域中,都有一个单独的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环境。)
答案 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)
}
}