UITableViewDataSource 方法的实现方式有什么变化吗?
Did something change in the way of implementing UITableViewDataSource methods?
最近 iOS 开发中可能发生了一些变化。
现在我们必须在 SceneDelegate 中设置我们的 window 和根 VC 而不是 AppDelegate 的 didFinishLauching。 (请不要故事板!)好吧,这不是那么困难,也没有那么不同。
但现在看起来我什至不能在我的 UITableViewDatasource 上出列单元格。就这么简单!我又做错了什么?我将行数设置为 80 只是为了确保会出现一些东西,但运气不好。我在我的 ViewController 中获得了 systemTeal 彩色 tableView(嵌入在 navigationController 中),仅此而已。有什么想法吗?
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
let cellId = "cellId"
lazy var tableView: UITableView = {
let tb = UITableView()
tb.translatesAutoresizingMaskIntoConstraints = false
return tb
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemPink
setupTableView()
}
fileprivate func setupTableView() {
tableView.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
tableView.backgroundColor = .systemTeal
view.addSubview(tableView)
NSLayoutConstraint.activate([
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
tableView.topAnchor.constraint(equalTo: view.topAnchor),
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
tableView.widthAnchor.constraint(equalTo: view.widthAnchor),
tableView.heightAnchor.constraint(equalTo: view.heightAnchor)
])
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 80 }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCell(withIdentifier: cellId)!
cell.backgroundColor = .systemRed
cell.textLabel?.text = "cell: \(indexPath.row)"
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 50 }
func numberOfSections(in tableView: UITableView) -> Int { 1 }
}
除了设置delegate,还需要设置data source:
tableView.dataSource = self
当您创建包含一个tableView
(而不是UITableViewController
)的自定义ViewController
时,您必须记住设置DataSource
(如果需要,还有 Delegate
)。在这种情况下,最好的委托和数据源之一是在闭包中:
lazy var tableView: UITableView = {
let tb = UITableView()
tb.dataSource = self
tb.delegate = self
tb.translatesAutoresizingMaskIntoConstraints = false
return tb
}()
最近 iOS 开发中可能发生了一些变化。 现在我们必须在 SceneDelegate 中设置我们的 window 和根 VC 而不是 AppDelegate 的 didFinishLauching。 (请不要故事板!)好吧,这不是那么困难,也没有那么不同。 但现在看起来我什至不能在我的 UITableViewDatasource 上出列单元格。就这么简单!我又做错了什么?我将行数设置为 80 只是为了确保会出现一些东西,但运气不好。我在我的 ViewController 中获得了 systemTeal 彩色 tableView(嵌入在 navigationController 中),仅此而已。有什么想法吗?
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
let cellId = "cellId"
lazy var tableView: UITableView = {
let tb = UITableView()
tb.translatesAutoresizingMaskIntoConstraints = false
return tb
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemPink
setupTableView()
}
fileprivate func setupTableView() {
tableView.delegate = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
tableView.backgroundColor = .systemTeal
view.addSubview(tableView)
NSLayoutConstraint.activate([
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
tableView.topAnchor.constraint(equalTo: view.topAnchor),
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
tableView.widthAnchor.constraint(equalTo: view.widthAnchor),
tableView.heightAnchor.constraint(equalTo: view.heightAnchor)
])
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 80 }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCell(withIdentifier: cellId)!
cell.backgroundColor = .systemRed
cell.textLabel?.text = "cell: \(indexPath.row)"
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 50 }
func numberOfSections(in tableView: UITableView) -> Int { 1 }
}
除了设置delegate,还需要设置data source:
tableView.dataSource = self
当您创建包含一个tableView
(而不是UITableViewController
)的自定义ViewController
时,您必须记住设置DataSource
(如果需要,还有 Delegate
)。在这种情况下,最好的委托和数据源之一是在闭包中:
lazy var tableView: UITableView = {
let tb = UITableView()
tb.dataSource = self
tb.delegate = self
tb.translatesAutoresizingMaskIntoConstraints = false
return tb
}()