当UITableView为空时显示消息

时间:2019-12-23 19:17:24

标签: swift xcode uitableview

我有一个UITableView,其中显示了json模型中的数据。没有数据时我需要显示文本。

我尝试使用以下代码:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if datosEventos.events.count == 0{
        let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height))
        emptyLabel.text = "No Data"
        emptyLabel.textAlignment = NSTextAlignment.center
        self.tableView.backgroundView = emptyLabel
        self.tableView.separatorStyle = UITableViewCell.SeparatorStyle.none
        return 0
    } else {
        return datosEventos.events.count
    }
}

在没有数据的情况下它可以很好地工作,但是在有数据的情况下,它还会显示几秒钟,然后再将数据加载到表中。

我尝试使用此处找到的其他解决方案,但是与有数据时加载表时的问题相同,该消息会显示几秒钟,而在有数据时则不应该显示该消息。

我获取json数据的功能是:

func GetData()  {

    // Remote JSON to Structed Object
    let url = URL(string: "https://testmysite.com/wp-json/tribe/events/v1/events")

    URLSession.shared.dataTask(with: url!) { (data, response, error) in

    if error == nil {
        do {
          // Decode data to object
           self.datosEventos = try JSONDecoder().decode(EventsFeed.self, from: data!)

            DispatchQueue.main.async {

                self.tableView.reloadData()
                self.refreshControl!.endRefreshing()

                print(self.datosEventos)

            }

        } catch let jsonError{
            print("An error occurred: \(jsonError)")
        }
   }

 }.resume()

} 

Also try this solution, but the same problem.

图片->有数据的示例:

Example when there is data

1 个答案:

答案 0 :(得分:0)

最初,表在没有数据时加载,因此命中

if datosEventos.events.count == 0{
    let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height))
    emptyLabel.text = "No Data"
    emptyLabel.textAlignment = NSTextAlignment.center
    self.tableView.backgroundView = emptyLabel
    self.tableView.separatorStyle = UITableViewCell.SeparatorStyle.none

因此,您可以在数据返回此处后在回调内部进行操作

    DispatchQueue.main.async {    // Recommended 
       if datosEventos.events.count == 0 {
       }
       else {}
    }

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if datosEventos.events.count == 0{
        let emptyLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height))
        emptyLabel.text = "No Data"
        emptyLabel.textAlignment = NSTextAlignment.center
        self.tableView.backgroundView = emptyLabel
        self.tableView.separatorStyle = UITableViewCell.SeparatorStyle.none
        return 0
    } else { 
        self.tableView.backgroundView = nil
        return datosEventos.events.count
    }

}

不建议使用后一种选项,因为它将在一段时间内显示no Data,因此建议您先使用该建议