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
}()