Swift:如何在UITableViewController中立即重新加载数据?

时间:2019-04-30 15:05:09

标签: swift uitableview

我在Swift的UITableView中有许多条目(单元格),每个条目代表每个用户可以选择的“歌曲”。尚未完成的歌曲标题以问号表示,其他歌曲则正常显示。用户完成的歌曲存储在firebase数据库中,该数据库在UITableViewController生命周期开始时立即读取,并存储在我称为temp_dict的全局词典中。

字典temp_dict的格式为

键=“ 02”:值=“完成”, 键=“ 03”:值=“完成”, 等

问题在于,不会立即将数据加载到此Dictionary中,并且不会立即调用以下“加载单元格”功能:

覆盖func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell {}

在我从Firebase获得信息来确定哪些信息尚未完成之前发生。

我现在处在一种奇怪的情况下,问号只会在我向下滚动到底部(大约30个单元格)然后再次向上滚动之后才会出现。我相信是因为每个单元格都被删除并在删除后再次添加并重新出现在屏幕上

我尝试过的方法:我尝试过在各个阶段使用self.tableView.reloadData(),但是由于某种原因它什么也没做。

class MainTableViewController: UITableViewController {

...

override func tableView(_ tableView: UITableView, cellForRowAt 
indexPath: IndexPath) -> UITableViewCell {
        let myCell = tableView.dequeueReusableCell(withIdentifier: "cell", 
for: indexPath)
        myCell.textLabel?.text = songs[indexPath.row].title
        myCell.detailTextLabel?.text = songs[indexPath.row].artist
        if (self.temp_dict[String(indexPath.row+1)] != "Complete") {
            myCell.textLabel?.text = question_marks(s : 
songs[indexPath.row].title)
            myCell.detailTextLabel?.text = question_marks(s : 
songs[indexPath.row].artist)
        }
        num_times_called = num_times_called + 1
        return myCell
    }

...

}
  • 功能question_marks()仅接收一个字符串,并用问号替换每个字符,以表示该级别尚未完成,因此已被隐藏。

**歌曲是一组具有标题,艺术家,歌曲编号等属性的歌曲对象。

结果:

现在,当我启动这个viewcontroller时,所有单元格都完全是问号。当我滚动到底部并向上滚动时,已经完成的歌曲现在突然不再显示为问号(这是我想要的,但是我希望这种情况立即发生)。

摘要:

我需要一种在发生特定事件后立即自动重新加载uitableview上的所有单元格的方法。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

P先生的回答几乎是正确的。我建议在主线程上重新加载tableview:

var temp_dict: [String: String] {
    didSet {
        DispatchQueue.main.async {
            tableView.reloadData()
        }
    }
}

答案 1 :(得分:0)

在您的temp_dict对象中添加一个属性观察器,以便它在更新后将自动重新加载表视图

var temp_dict: [String: String] {
    didSet {
        tableView.reloadData()
    }
}