我想要的是在调用viewDidAppear时滚动到tableView中某个部分的行。 我创建了这个简单的应用程序进行测试。我试图弄清楚为什么在尝试使用scrollToRow时崩溃。它在AppDelegate中崩溃----错误线程1:信号SIGABRT
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
let tableView = UITableView()
let section = 2
let row = 3
let data = ["Cat", "Dog", "Bird", "Cow", "Owl", "Deer", "Rabbit", "Bull", ]
@IBOutlet weak var myTable: UITableView!
override func viewDidAppear(_ animated: Bool) {
// Crash in AppDelegate ---- Error Thread 1: signal SIGABRT
tableView.scrollToRow(at: IndexPath(row: row, section: section), at: UITableView.ScrollPosition.top, animated: true)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func numberOfSections(in tableView: UITableView) -> Int {
return data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel!.text = data[indexPath.row]
return cell
}
}
答案 0 :(得分:1)
您要使用IBOutlet myTable
,而不要使用变量tableView
。因此,当您滚动到特定行时,将代码中的tableView
替换为myTable
myTable.scrollToRow(at: IndexPath(row: row, section: section), at: .top, animated: true)
以及cellForRowAt
数据源方法
let cell = myTable.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
接下来,我在您的代码中看不到您设置了myTable
的委托和数据源。所以解决它:
override func viewDidLoad() {
super.viewDidLoad()
myTable.delegate = self
myTable.dataSource = self
}
答案 1 :(得分:0)
您说let tableView = UITableView()
,但是从不配置它。实际上,您可以删除此变量,因为有了IBOutlet后就不需要它了。因此,您应该像这样使用TableView
中的IBOutlet
:
self.myTable.scrollToRow(at: IndexPath(row: self.row, section: self.section), at: UITableView.ScrollPosition.top, animated: true)
而您忘记设置TableView的Delegate和DataSource。为此:
override func viewDidAppear(_ animated: Bool) {
self.myTable.delegate = self
self.myTable.dataSource = self
}
注意::您必须确保第3行和第2部分存在!