如何使用 SearchBar 和 for 循环返回对象数组

Posted

技术标签:

【中文标题】如何使用 SearchBar 和 for 循环返回对象数组【英文标题】:How to return an array of objects using SearchBar and for loop 【发布时间】:2020-07-19 01:45:43 【问题描述】:

我希望搜索栏返回数组中每个对象的标题。我相信问题出在我的 for 循环中,但我不确定。希望你们能告诉我我做错了什么。

我正在通过 API 进行搜索。这是我试图搜索的数组

struct ProductResponse: Decodable 
    let results: [SearchResults]


struct SearchResults: Decodable 
    let title: String
    let id:Int

我创建了一个 for 循环来遍历数组中的每个对象并获取标题和 ID。

func fetchProduct(productName: String) 
    let urlString = "\(searchURL)&query=\(productName)&number=25"
    performRequest(urlString: urlString)

func performRequest(urlString: String) 
    
    // Create a URL
    
    if let url = URL(string: urlString) 
        
        //Create a URLSession
        
        let session = URLSession(configuration: .default)
        // Give the session a task
        
        let task = session.dataTask(with: url)  (data, response, error) in
            if error != nil 
                print(error!)
                return
            
            if let safeData = data 
                self.parseJSON(productTitle: safeData)
            
            
        
        
        // Start the task
        task.resume()
        
        
    
    


func parseJSON(productTitle: Data) 
    let decoder = JSONDecoder()
    do 
    let decodedData = try decoder.decode(ProductResponse.self, from: productTitle)
        
        print(decodedData.results)
     catch 
        print(error)
    

我创建了这个函数来重新加载表格视图中的数据。当我在搜索栏中搜索产品结果时,我的 tableview 没有返回任何内容。目标是让我的 tableview 在 tableview 单元格中返回每个结果

var listOfProducts = [SearchResults]() 
    didSet 
        DispatchQueue.main.async 
            self.tableView.reloadData()
            self.navigationItem.title = "\(self.listOfProducts.count) Products found"
        
    


override func viewDidLoad() 
    super.viewDidLoad()
    productSearch.delegate = self



func downloadJSON() 
    guard let downloadURL = url else  fatalError("Failed to get URL")
    
    URLSession.shared.dataTask(with: downloadURL)  (data, Response, error) in
        print("downloaded")
    .resume()

// MARK: - Table view data source

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


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows
    return listOfProducts.count

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    
    let product = listOfProducts[indexPath.row].title
    
    cell.textLabel?.text = product

    
    return cell





extension ProductsTableViewController: UISearchBarDelegate 
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) 
        if let searchBarText = searchBar.text 
            searchRequest.fetchProduct(productName: searchBarText)
        
    

这是结果 enter image description here

【问题讨论】:

嘿 Andrew,在 parseJSON 方法下,您应用了一个循环来获取每个对象的标题,但您能否确认在同一个函数变量“decodedData.results”下是否有值?如果是,该变量包含一个值,那么您为什么要使用 for 循环,因为我看到您使用了表格视图,您可以传递该变量并使用每个对象标题 using=> result[indexpath.row]?.title 在您的单元格上排在。 感谢@AshutoshkumarMishra。所以我打印出 decodedData.results 的结果并取回每个产品的标题和 id。我的问题现在我的表格视图单元格不显示标题。我得到的只是空白单元格。 因此,当您打印出 decodedData.results 的结果并以数组的形式获得结果时,然后将该数组分配给您的“listOfProducts”变量并重新加载表格视图。 嘿@AshutoshkumarMishra,由于某种原因,当ai打印出listOfProducts时,它不会返回任何内容。即使我将变量设置为 [SearchResults] 数组。我觉得我错过了一些简单的事情。 您好 Andrew,如果您在“decodedData.results”中有数据,那么它肯定会在重新加载表后分配给“listOfProducts”。 【参考方案1】:

如果一切顺利,你在“parseJSON”方法的“decodedData.results”下得到了数据,我看到“decodedData.results”和“listOfProducts”这两个变量都是相同类型的SearchResults 。因此,您只需在“parseJSON”方法下添加一行如下:-

 func parseJSON(productTitle: Data) 
  let decoder = JSONDecoder()
  do 
  let decodedData = try decoder.decode(ProductResponse.self, from: productTitle)
    
     print(decodedData.results)// it have some array data of type SearchResults
     self.listOfProducts = decodedData.results
     self.tableView.reloadData()

    catch 
    print(error)
  

【讨论】:

以上是关于如何使用 SearchBar 和 for 循环返回对象数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SearchBar 从服务器获取数据

如何使用for循环将返回值分配给变量

如何在Django视图中使用for循环返回每次迭代[关闭]

如何从 for 循环返回多个具有唯一名称的 pandas 数据帧?

如何在for循环中等待每次迭代并在nodeJS中将响应作为API响应返回

递归 C# 函数从 for 循环内部返回 - 如何转换为 F#?