【问题标题】:TableViewController is not showing up in simulatorTableViewController 没有出现在模拟器中
【发布时间】:2021-11-15 16:53:04
【问题描述】:

我创建了一个 TableViewController 并添加了我的 Json 数据,但 TableView 没有显示。我的代码正在运行并且没有给出任何错误,调试器看起来也很好,但我看到的只是一个白屏。谁能告诉我我做错了什么?

导入 UIKit

类 HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

public var meals = [Meal]()
override func viewDidLoad() {
    self.tableView.delegate = self
    self.tableView.dataSource = self
    super.viewDidLoad()
    fetchJSON {
        self.tableView.reloadData()
 }
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return  meals.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = UITableViewCell(style: .default , reuseIdentifier: nil)
    cell.textLabel?.text = meals[indexPath.row].strMeal.capitalized
    return cell
}


func fetchJSON(completed: @escaping () -> ()) {
    
    let jsonUrlString =  "https://www.themealdb.com/api/json/v1/1/filter.php?c=Beef"
    
    guard let url = URL(string: jsonUrlString) else {
        print("invalid url string lel")
        return
    }
    print("Select a meal to make today!")
    
    URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data else {
            return
        }
        do {
            let decoder = JSONDecoder()
            let mealDetailResponse = try decoder.decode(MealDetailResponse.self, from: data)
            for meals in  mealDetailResponse.meals {
                print("The Meal is \(meals.self)")
                DispatchQueue.main.async {
                    completed()
                }
            }
        }catch {
            print(error)
        }
    }.resume()
}
 

}

【问题讨论】:

  • 添加self.meals = mealDetailResponse.meals并查看
  • 我在哪里添加这个?
  • 行后let mealDetailResponse = ....
  • 这样? let decoder = JSONDecoder() let mealDetailResponse = try decoder.decode(MealDetailResponse.self, from: data) self.meals = mealDetailResponse.meals 我仍然没有得到任何我的餐桌列表餐

标签: swift xcode uikit tableview


【解决方案1】:

我确认@RTXGamer 解决方案有效。 我还从循环中删除了调度,因为您希望在处理完所有数据后只更新一次 tableview(即使在您的情况下,mealDetailResponse 中只有 1 个项目@

    func fetchJSON(completed: @escaping () -> ()) {

        let jsonUrlString =  "https://www.themealdb.com/api/json/v1/1/filter.php?c=Beef"

        guard let url = URL(string: jsonUrlString) else {
            print("invalid url string lel")
            return
        }
        print("Select a meal to make today!")

        URLSession.shared.dataTask(with: url) { data, response, error in
            guard let data = data else {
                return
            }
            do {
                let decoder = JSONDecoder()
                let mealDetailResponse = try decoder.decode(MealDetailResponse.self, from: data)
                self.meals = mealDetailResponse.meals
                for meals in mealDetailResponse.meals {
                    print("The Meal is \(meals.self)")
                }
                DispatchQueue.main.async {
                    completed()
                }
            }catch {
                print(error)
            }
        }.resume()
    }

或者,您可以在您实际需要主线程的完成块内调度。

fetchJSON {
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}

【讨论】:

  • 你真的得到了一个 tableView 呈现给你吗?因为我仍然有一个空白的白屏..
  • 我使用我在上面写的代码得到了与膳食列表一起显示的表格视图,您是否将您的tableView 插座正确链接到情节提要中的表格视图(界面构建器)?您可以断点: - 在do...catch 内,以确保您确实从服务器获得了答案。 - 在重新加载数据之前在fetchJSON 完成块内。如果两者都工作,你肯定有 UI 问题
猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2017-12-15
  • 2012-06-09
相关资源
最近更新 更多