我创建了一个自定义的UITableViewDataSource类。初始化时,我将tableView的委托和dataSource设置为self
,但是当调用reloadData()时,不会调用任何dataSource方法,并且传入的tableView没有任何更改。 (为清楚起见,我省略了下面的代理代码。)
class TopicsDataSource: NSObject, UITableViewDataSource, UITableViewDelegate {
var topics: [String : Topic] = [:]
var cellConfigBlock: ((UserTopicCell, Topic) -> ())? = nil
var tableView: UITableView!
var user: User!
init(tableView: UITableView, user: User) {
super.init()
self.tableView = tableView
self.user = user
tableView.dataSource = self
tableView.delegate = self
self.getData() // Call reloadData
}
func getData() {
let rootRef = FIRDatabase.database().reference()
DispatchQueue.global(qos: .userInitiated).async {
let updateGroup = DispatchGroup()
for tid in self.user.topicIDs!.keys {
updateGroup.enter()
rootRef.child("topics/" + tid).observeSingleEvent(of: .value, with: { (snp) in
let newTopic = Topic(json: (snp.value as! [String : Any]), completion: {
updateGroup.leave()
})
self.topics.updateValue(newTopic!, forKey: snp.key)
})
}
updateGroup.notify(queue: .main, execute: {
// Notice: the dataSource reference of tableView is weak
self.tableView.reloadData()
})
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let topic = Array(topics.values)[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "topicCell") as! UserTopicCell
if let config = cellConfigBlock {
config(cell, topic)
}
cell.topic = topic
return cell
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return topics.count
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
// Delegate Methods ...
}
答案 0 :(得分:0)
那么,在这种情况下,您必须自定义重新加载数据以及表视图的自定义数据源和自定义委托。
答案 1 :(得分:0)
您的代码未显示设置tableview委托的代码。什么类充当tableview委托?这是你的定制课程吗?如果是这样,您的设置代码中应该包含以下内容:
tableView.delegate = <Reference to custom class>