Swift:如何在不同的 Table 视图中加载 JSON

Swift: How to Load JSON in different Table View

大家好,我是 Swift 的新手,我需要帮助。

所以我有三个不同的 JSON 会在不同的时刻显示,第一个 JSON 已经完美加载,但是当我点击该项目重新加载另一个 JSON 和显示详细信息什么都没有出现。

我对细节感到困惑:

每个 JSON 需要三个不同的 table 视图吗?还是只有一个就够了? 当我处理数据 (JSON) 时,我需要使用特定函数来准备将显示为“准备”的新 JSON 吗?

在我的项目中我有: 两个视图控制器:ViewController(默认)和 DetailViewController。 在我的 Main.Storyboard 中:Tab Bar Controller --> Navigation --> Table View

第一个视图控制器的代码:

import UIKit

class ViewController: UITableViewController {
    var categories = [Category]()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let urlString = "https://www.themealdb.com/api/json/v1/1/categories.php"
        
        if let url = URL(string: urlString) {
            if let data = try? Data(contentsOf: url) {
                parse(json: data)
            } else {
                print("error connecting")
            }
        }
    }
    
    func parse(json: Data) {
        let decoder = JSONDecoder()
        print("parse called")
        
        do {
            let jsonCategories = try decoder.decode(Categories.self, from: json)
            
            categories = jsonCategories.categories
            
            tableView.reloadData()
            
        } catch {
            print("error parsin: \(error)")
        }
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return categories.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let category = categories[indexPath.row]
        cell.textLabel?.text = category.idCategory
        cell.detailTextLabel?.text = category.strCategoryDescription
        return cell
    }
    
   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let newViewController = DetailViewController()
        self.navigationController?.pushViewController(newViewController, animated: true)
    }
}


The code of the second view controller:

import UIKit
import WebKit

class DetailViewController: UIViewController {
    var webView: WKWebView!
    var meals = [Meal]()

    override func loadView() {
       webView = WKWebView()
        view = webView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let urlString = "https://www.themealdb.com/api/json/v1/1/filter.php?c=Beef"
        
        if let url = URL(string: urlString) {
            if let data = try? Data(contentsOf: url) {
                parse(json: data)
            } else {
                print("error connecting")
            }
        }
    }
    func parse(json: Data) {
        let decoder = JSONDecoder()
        print("parse called")
        
        do {
            let jsonMeals = try decoder.decode(Meals.self, from: json)
            
            meals = jsonMeals.meals
            print(String(format:"read %d meals", meals.count))
            
            
            
        } catch {
            print("error parsin: \(error)")
        }
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return meals.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let meal = meals[indexPath.row]
        cell.textLabel?.text = meal.idMeal
        cell.detailTextLabel?.text = meal.strMeal
        return cell
    }
}

DetailViewController 上的函数 parse(json: Data) 没有调用 tableView.reloadData() 所以新数据无法加载到 UITableView

Need I have three differents table Views for each JSON? or the only one is enough?

如果您要加载不同的 JSON 文件但想在同一视图中显示。您只需要 1 个 UITableViewCell。

加载和解码时 JSON,考虑将其移至后台队列以避免阻塞主线程。