为什么我的 TableView 没有显示任何内容?

Why is my TableView not showing any content?

我创建了一个简单的 TableView,它从 Firestore 获取国家/地区列表。 网络请求工作正常,我不怀疑有任何问题。 所有变量都已填充。 控制台中没有显示错误。 但是我的 TableView 仍然是空的,没有出现在 UI.

有人可以看出下面代码中的任何明显错误吗?


import UIKit

class MainViewController: UIViewController {
    
  [@IBOutlets...]

    var countryList: [Country] = []
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        countriesTableView.delegate = self
        countriesTableView.dataSource = self
        countriesTableView.register(UINib(nibName: "CountriesCell", bundle: nil), forCellReuseIdentifier: "CountriesCell")
        
        getCountries()
        
    }

    func getCountries (){
        
        NetworkManager.shared.getCountryList { success in
            if success {
                self.countryList = NetworkManager.shared.data!
                self.countriesTableView.reloadData()
                print (self.countryList)
                
            }
            else {
                print ("Error fetching countries")
            }
        }
        
    }
}

extension MainViewController: UITableViewDelegate {
    

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
        populationLabel.text = countryList[indexPath.row].population
        sizeLabel.text = countryList[indexPath.row].size
        countryLabelMain.text = countryList[indexPath.row].name
        
    }
    
    
    
}


extension MainViewController: UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        print (countryList.count)
        return countryList.count
    }
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = countriesTableView.dequeueReusableCell(withIdentifier: "CountriesCell", for: indexPath) as! CountriesCell
        
        cell.countryLabel.text = countryList[indexPath.row].name
           
        return cell
    }
      
}

您没有在主线程上重新加载表视图。

而不是:self.countriesTableView.reloadData()

尝试: DispatchQueue.main.async{[weak self] in self?.countriesTableView.reloadData() }

以下对我来说很好用:

override func viewDidLoad() {
    super.viewDidLoad()
    
    countriesTableView.delegate = self
    countriesTableView.dataSource = self

    countriesTableView.estimatedRowHeight = 60 // use as you need
    countriesTableView.rowHeight = UITableView.automaticDimension

    countriesTableView.register(UINib(nibName: "CountriesCell", bundle: nil), forCellReuseIdentifier: "CountriesCell")
    
    getCountries()
}


func getCountries() {
    
    NetworkManager.shared.getCountryList { success in
        if success {
            self.countryList = NetworkManager.shared.data!

            DispatchQueue.main.async{ [weak self] in 
                self?.countriesTableView.reloadData() 
            }
        }
        else {
            print ("Error fetching countries")
        }
    }
}

可能是单元格的问题,设置单元格大小的默认值,或者使用默认单元格

     override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
             return 70
    }