首页 > 解决方案 > 如何在 swift 上将 JSON 解码的数组传递给另一个 VC

问题描述

好吧,我试图将来自新闻 API 的一系列文章传递给另一个 VC,这样我就可以在我的 TableView 上显示它们,现在的问题是在我更新我的数组之前加载了 tableview,有没有办法在加载 tableview 之前更新数组?

我的代码:我的 NewsViewController 代码:

import UIKit
import Foundation

class NewsViewController: UITableViewController,NewsProtocol {
    
    func didUpdateNewsArr(arr: [Articles]) {
        newsArr = arr
        print("I'm loaded first!!")
//        print(newsArr[0].title)
    }
    

    var newsArr = [Articles]()
    
    var newsManager =  NewsManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.title = "Hot News"
        newsManager.newsProtocolDelegate = self
        newsManager.performRequest()

        
        
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        
    }
}





// MARK: - UITableView Delegate&DataSource Methods:
extension NewsViewController {
   
    // Return the number of rows for the table.
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return newsArr.count
    }

    // Provide a cell object for each row.
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       // Fetch a cell of the appropriate type.
       let cell = tableView.dequeueReusableCell(withIdentifier: "newsCell", for: indexPath)
       
       // Configure the cell’s contents.
       cell.textLabel!.text = "Cell text"
           
       return cell
    }
    
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        
    }
}

我的网络文件:

import Foundation
import UIKit

protocol NewsProtocol {
    func didUpdateNewsArr(arr: [Articles])
}


struct NewsManager {
    let newsURL = "https://newsapi.org/v2/everything?q=apple&from=2020-10-19&to=2020-10-19&sortBy=popularity&apiKey=009a08a56d664f1b92986e9cce27767b"
    
    var newsProtocolDelegate: NewsProtocol?
    
    
    func performRequest() {
        if let url = URL(string: newsURL) {
            let session = URLSession(configuration: .default)
            let task = session.dataTask(with: url) { (data, respone, error) in
                if error != nil {
                    print(error)
                    return
                }
                if let safeData = data {
                    self.parseJSON(newsData: safeData)
                }
            }
            task.resume()
        }
    }
    
    
    
    
    func parseJSON(newsData: Data) {
        let decoder = JSONDecoder()
        do {
        let decodedData = try decoder.decode(NewsData.self, from: newsData)
            let articlesArr = decodedData.articles
            newsProtocolDelegate?.didUpdateNewsArr(arr: articlesArr)
            
        } catch {
            print("")
        }
    }
    
    
}

标签: jsonswifttableview

解决方案


我已经解决了这个问题:) 谢谢各位,只需要 tableView.reload() 来重新加载单元格,因为 JSON 请求需要一段时间并且 tableView 是在请求​​之前组成的,我用过调度队列 :)


推荐阅读