簡體   English   中英

將Json響應從一個Viewcontroller傳遞到另一個Viewcontroller並填充CollectionView

[英]Pass Json response from one Viewcontroller to another Viewcontroller and populate CollectionView

我試圖將Http請求的Json響應從一個控制器傳遞到另一個控制器,在第二個控制器中,我想根據接收到的數據創建一個集合視圖。


import UIKit

class TableViewController: UITableViewController {

    let ingredientList = Ingredients().Ingredients
    public var arrayDrinks: Array<Any> = []
    let session = URLSession.shared


    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.reloadData()
        tableView.dataSource = self
        tableView.delegate = self

    }

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

    // MARK: - number of rows
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.ingredientList.count
    }

    // MARK: - creating cell
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellaIng", for: indexPath)

        let singoloIngrediente = self.ingredientList[indexPath.row]

        cell.textLabel?.text = singoloIngrediente
        return cell
    }


    // MARK: - get the Selected Item
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let selectedItem: String = ingredientList[indexPath.row]
        print("The selected ingredient is: \(selectedItem)")

        // parameter for http request
        let param = String(selectedItem.replacingOccurrences(of: " ", with: "_"))

        let url = URL(string: "https://www.thecocktaildb.com/api/json/v1/1/filter.php?i=\(param)")!

        // MARK: - Http request

        let task = session.dataTask(with: url) { data, response, error in

            if error != nil || data == nil {
                print("Client error!")
                return
            }

            guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
                print("Server error!")
                return
            }

            do {
                // data from network request
                let decoder = JSONDecoder()
                let response = try decoder.decode(ObjectDrink.self, from: data!) // ObjectDrink from Model

                self.arrayDrinks.append(response.drinks)
                let destinationVC = DrinksListCollectionViewController()
                destinationVC.remoteArray = response.drinks
                 print("print array drink \(destinationVC.remoteArray)")

            } catch { print(error) }

        }
        performSegue(withIdentifier: "InglistSegue", sender: self)
         task.resume()

//        let destinationVC = DrinksListCollectionViewController()
//        destinationVC.remoteArray = self.arrayDrinks
//        destinationVC.performSegue(withIdentifier: "InglistSegue", sender: self)

    } // END didSelectRowAt

}

當我將響應打印到控制台時,第二個控制器的數組為空,因此沒有數據從第一個響應(數組)傳遞到另一個控制器

您要移動的視圖控制器尚不可用,並且您的行:

let destinationVC = DrinksListCollectionViewController()

創建一個新的視圖控制器,它不是您的應用過渡到的控制器。 要使用將顯示的視圖控制器,請使用prepare(for segue: UIStoryboardSegue, sender: Any?)如下所示:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destinationVC = segue.destination as? DrinksListCollectionViewController {
        destinationVC.remoteArray = self.arrayDrinks
    }
}

您需要將其呈現在URLSession.shared.dataTask的回調中,例如

DispatchQueue.main.async {
    self.arrayDrinks.append(response.drinks)
    let destinationVC = DrinksListCollectionViewController()
    destinationVC.remoteArray = response.drinks
    print("print array drink \(destinationVC.remoteArray)")
    self.present(destinationVC,animated:true,completion:nil)
}

如果是segue,則將上面的內容替換為(也在完成內容中)

DispatchQueue.main.async {
  performSegue(withIdentifier: "InglistSegue", sender: response.drinks)
}

添加此方法

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
  let destinationVC = segue.destination as! DrinksListCollectionViewController 
  destinationVC.remoteArray = sender as! [Model] // model it type of drinks 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM