当前位置 : 主页 > 手机开发 > ios >

ios – Swift 4:UITableView dataSource无法正常工作

来源:互联网 收集:自由互联 发布时间:2021-06-11
我正在尝试将一些数据添加到UITableView对象. 我的问题是我的数据源对象中没有一个方法在运行时被调用. 我已经检查过UITableView本身是否显示. 当我调用providerTable.reloadData()时只调用num
我正在尝试将一些数据添加到UITableView对象.
我的问题是我的数据源对象中没有一个方法在运行时被调用.
我已经检查过UITableView本身是否显示.
当我调用providerTable.reloadData()时只调用numberOfSections(在tableView:UITableView中) – > Int和tableView(_ tableView:UITableView,numberOfRowsInSection section:Int) – >调用Int方法,但从不tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) – >的UITableViewCell

import UIKit

class ProviderViewController: UIViewController {

    let navigationBar = { () -> UINavigationBar in
        let bar = UINavigationBar()
        bar.setItems([
            { () -> UINavigationItem in
                let item = UINavigationItem()
                item.title = "a title"
                return item
            }()
        ], animated: false)
        bar.translatesAutoresizingMaskIntoConstraints = false
        return bar
    }()
    let providerTable = { () -> UITableView in
        let providerDataSource = ProviderTableDataSource()

        let table = UITableView()
        table.dataSource = providerDataSource
        table.translatesAutoresizingMaskIntoConstraints = false
        table.register(ProviderTableViewCell.self, forCellReuseIdentifier: "providerCell")
        return table
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.setupWindow()
    }

    func setupWindow() -> Void {
        view.backgroundColor = .white

        view.addSubview(navigationBar)
        view.addSubview(providerTable)

        // Set constraints
        var constraints = [NSLayoutConstraint]()
        // navbar
        constraints.append(NSLayoutConstraint(item: navigationBar,
                                              attribute: .width,
                                              relatedBy: .equal,
                                              toItem: view,
                                              attribute: .width,
                                              multiplier: 1,
                                              constant: 0))
        constraints.append(NSLayoutConstraint(item: navigationBar,
                                              attribute: .left,
                                              relatedBy: .equal,
                                              toItem: view,
                                              attribute: .left,
                                              multiplier: 1,
                                              constant: 0))
        constraints.append(NSLayoutConstraint(item: navigationBar,
                                              attribute: .top,
                                              relatedBy: .equal,
                                              toItem: view.safeAreaLayoutGuide,
                                              attribute: .top,
                                              multiplier: 1,
                                              constant: 0))
        // provider table
        constraints.append(NSLayoutConstraint(item: providerTable,
                                              attribute: .width,
                                              relatedBy: .equal,
                                              toItem: view,
                                              attribute: .width,
                                              multiplier: 1,
                                              constant: 0))
        constraints.append(NSLayoutConstraint(item: providerTable,
                                              attribute: .left,
                                              relatedBy: .equal,
                                              toItem: view,
                                              attribute: .left,
                                              multiplier: 1,
                                              constant: 0))
        constraints.append(NSLayoutConstraint(item: providerTable,
                                              attribute: .top,
                                              relatedBy: .equal,
                                              toItem: navigationBar,
                                              attribute: .bottom,
                                              multiplier: 1,
                                              constant: 0))
        constraints.append(NSLayoutConstraint(item: providerTable,
                                              attribute: .bottom,
                                              relatedBy: .equal,
                                              toItem: view,
                                              attribute: .bottom,
                                              multiplier: 1,
                                              constant: 0))
        // activate constraints
        view.addConstraints(constraints)
    }

}

数据源对象:
    导入UIKit

class ProviderTableDataSource: NSObject, UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "providerCell", for: indexPath) as! ProviderTableViewCell
        cell.charterProvider = CharterProviders.providers[indexPath.row]

        return cell
    }
}
您没有对创建表视图时创建的ProviderTableDataSource保持强引用:

let providerTable = { () -> UITableView in
    let providerDataSource = ProviderTableDataSource()

    let table = UITableView()
    table.dataSource = providerDataSource
    table.translatesAutoresizingMaskIntoConstraints = false
    table.register(ProviderTableViewCell.self, forCellReuseIdentifier: "providerCell")
    return table
}()

UITableView的dataSource属性很弱,因此您不能依赖它来保存对ProviderTableDataSource的强引用.请参阅此处的文档:
https://developer.apple.com/documentation/uikit/uitableview/1614955-datasource?changes=_6

你想做的可能是这样的:

class ProviderViewController: UIViewController {
    private let providerDataSource = ProviderTableDataSource()

    private(set) lazy var providerTable: UITableView = {
        let table = UITableView()
        table.dataSource = self.providerDataSource
        table.translatesAutoresizingMaskIntoConstraints = false
        table.register(ProviderTableViewCell.self, forCellReuseIdentifier: "providerCell")
        return table
    }()

    // [...]
}

这样,视图控制器持有对ProviderTableDataSource的强引用,因此在创建表视图后不会释放它.

网友评论