TableView reloadData对自定义dataSource类不执行任何操作

时间:2017-03-20 04:35:31

标签: ios swift uitableview

我创建了一个自定义的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 ...
}

2 个答案:

答案 0 :(得分:0)

那么,在这种情况下,您必须自定义重新加载数据以及表视图的自定义数据源和自定义委托。

答案 1 :(得分:0)

您的代码未显示设置tableview委托的代码。什么类充当tableview委托?这是你的定制课程吗?如果是这样,您的设置代码中应该包含以下内容:

tableView.delegate = <Reference to custom class>