我在静态单元格中嵌入了一个动态UITableView。
我还根据这个问题的答案创建了一个新的数据源:Swift:Static UITableViewCell 中的 TableView
我的问题是动态UITableView的数据没有加载。你能帮我理解为什么吗?
class CreateCompanyTableViewController: UITableViewController {
@IBOutlet weak var lblNumberOfUser: UILabel!
var newStakeholders: [ReadOrganizationStakeholder] = []
@IBOutlet weak var companyUsersTableView: UITableView!
override func viewDidLoad() {
let dataSource = NewUserDataSource(newStakeholders: self.newStakeholders)
super.viewDidLoad()
lblNumberOfUser.text = "(newStakeholders.count) Users"
companyUsersTableView.dataSource = dataSource
companyUsersTableView.delegate = dataSource
companyUsersTableView.reloadData()
}
override func viewDidAppear(_ animated: Bool) {
lblNumberOfUser.text = "(newStakeholders.count) Users"
}
@IBAction func addNewUser(_ sender: Any) {
performSegue(withIdentifier: "segueAddNewUsers", sender: sender)
}
@IBAction func unwindFromSelectSubUsertoAddUserCompany(_ sender: UIStoryboardSegue){
if let senderVC = sender.source as? NewUserForCompanyTableViewController{
print(senderVC.newStakeholder!)
var newuser = senderVC.newStakeholder!
self.newStakeholders.append(newuser)
companyUsersTableView.reloadData()
}
}
}
class NewUserDataSource: NSObject, UITableViewDataSource ,UITableViewDelegate{
// We keep this public and mutable, to enable our data
// source to be updated as new data comes in.
var newStakeholders: [ReadOrganizationStakeholder]
init(newStakeholders: [ReadOrganizationStakeholder]) {
self.newStakeholders = newStakeholders
}
func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return newStakeholders.count
}
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let stakeholders = newStakeholders[indexPath.row]
let cell = tableView.dequeueReusableCell(
withIdentifier: "newUserTableViewCell",
for: indexPath
) as! NewUserTableViewCell
cell.lblUsername.text = stakeholders.fullName
cell.lblEmail.text = stakeholders.emailAddress
return cell
}
}
UITableViewdataSource
和delegate
属性对您在 viewDidLoad 中初始化的NewUserDataSource
具有弱引用。
由于初始化的NewUserDataSource
在完成后viewDidLoad
任何地方都没有强引用,因此 UITableView 的dataSource
和delegate
设置为 nil,因为它们是弱引用,不会将NewUserDataSource
保留在内存中。
若要解决此问题,请创建一个类型为NewUserDataSource
的类属性,该属性将保存对数据源的强引用。
大致如下:
class CreateCompanyTableViewController: UITableViewController {
private lazy var dataSource = NewUserDataSource(newStakeholders: self.newStakeholders)
}
在使用dataSource
之前,只需确保self.newStakeholders
其中包含值