如何将API数据传递到表格视图单元格

问题描述 投票:0回答:2

我在将 API 返回的数据传递到表视图单元格时遇到一些问题。我将数据附加到一个数组,然后将该数组传递到表视图(像往常一样)以获取单元格的行数和数据。当我在要附加的函数内部打印时,标题显示在数组中。在外面他们不是。有什么想法吗?相关代码如下:

import UIKit

class ProductTableViewController: UITableViewController, UISearchBarDelegate {
    @IBOutlet weak var searchBar: UISearchBar!
        
    @IBOutlet var tabView: UITableView!
    var filteredData = ["Title1"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        getProducts { (products) in
            for product in products {
                self.filteredData.append(product.title)
            }
        }

    }
        
        func getProducts(completionHandler: @escaping([ProductDetail]) -> Void) {
            let url = URL(string: "exampleAPIURL")!

            let dataTask = URLSession.shared.dataTask(with: url) {data, _, _ in
                guard let jsonData = data else { return }
                do {
                    let decoder = JSONDecoder()
                    let productsResponse = try decoder.decode(Products.self, from: jsonData)
                    let productDetails = productsResponse.data
                    for name in productDetails {
                        self.filteredData.append(name.title)
                    }
                    completionHandler(productDetails)
                }catch {
                    print(error.localizedDescription)
                }
            }
            dataTask.resume()
        }
    
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if filteredData == nil {
            return 1 }
        else {
        return filteredData.count
        }

    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
        UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell
            for name in filteredData {
                if name != nil {
                    let product = filteredData[indexPath.row]
                    cell.textLabel?.text = product

                } else {
                    cell.textLabel?.text = "name"

                }
            }

            return cell
    }

当我运行模拟器时,我仅收到

filteredData
数组中的硬编码字符串。有没有其他方法来传递 JSON?

ios swift tableview
2个回答
0
投票

收集数据后重新加载表视图:

getProducts { (products) in
    for product in products {
        self.filteredData.append(product.title)
    }
    self.tabView.reloadData()
}

0
投票

设置数组后,需要调用

self.tableView.reloadData()
并在主线程中调用它。

此外,最好从

viewDidAppear
进行产品 API 调用,因为如果
viewDidLoad
的 API 调用返回得足够快,视图上的操作可能会失败。您可能还想显示一些活动指示器。

  override func viewDidAppear() {
        super.viewDidLoad()
        getProducts { (products) in
            for product in products {
                self.filteredData.append(product.title)
            }
             DispatchQueue.main.async {
              self.tableView.reloadData()
           }
        }

    }
© www.soinside.com 2019 - 2024. All rights reserved.