我正在尝试将一些数据添加到UITableView对象. 我的问题是我的数据源对象中没有一个方法在运行时被调用. 我已经检查过UITableView本身是否显示. 当我调用providerTable.reloadData()时只调用num
我的问题是我的数据源对象中没有一个方法在运行时被调用.
我已经检查过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的强引用,因此在创建表视图后不会释放它.
