在 TableView 中显示城市名称

Display city names in a TableView

我想根据用户在搜索栏中键入的内容在表格视图中显示所有城市名称。 例如,如果用户在 searchBar 中键入 "New York",我希望显示 API 给我的所有结果。 我正在使用 API 其中 returns JSON 数据。

现在我正在使用这个委托方法:

extension searchViewController : UISearchBarDelegate{

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

        RequestAPI.queryCities(cityNameString: searchBar.text!) { (cities) in
        for iterator  in 0...cities.geonames.count-1 {
            self.citiesQueried.append(cities.geonames[iterator])
        }
    }

        self.tableView.reloadData()
}


func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    print("cancel button clicked")
    self.citiesQueried.removeAll()
    self.tableView.reloadData()
}
}

citiesQueried 是我之前在 viewController 中声明为空的数组,其任务是收集 API 请求产生的所有数据。

这些是 UITableView 的委托方法:

extension searchViewController : UITableViewDelegate, UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return citiesQueried.count
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "searchCityTableViewCell", for: indexPath)
    cell.textLabel?.text = self.citiesQueried[indexPath.row].name
    return cell
}
}

问题是它有时有效,有时无效,我需要按两次搜索按钮才能看到 tableView 上显示的城市。 我觉得有些东西不见了,我希望你们中的一些人能给我一些关于如何解决这个问题的建议

从 API 成功后重新加载 tableView,如下所示:

RequestAPI.queryCities(cityNameString: searchBar.text!) { (cities) in
         for iterator  in 0...cities.geonames.count-1 {
            self.citiesQueried.append(cities.geonames[iterator])
         }
      self.tableView.reloadData()
    }

您必须在异步任务的完成处理程序中重新加载 table 视图

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

    RequestAPI.queryCities(cityNameString: searchBar.text!) { (cities) in
        for iterator  in 0..<cities.geonames.count {
            self.citiesQueried.append(cities.geonames[iterator])
        }
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}

旁注:

名称cities暗示是一个数组,但它似乎是一个单一的对象。则不需要 for 循环并以单数形式命名参数

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

    RequestAPI.queryCities(cityNameString: searchBar.text!) { city in          
        self.citiesQueried = city.geonames         
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}