在TableView中显示城市名称

时间:2020-03-10 11:37:16

标签: ios swift api uitableview uisearchbar

我想根据用户在searchBar中输入的内容在表格视图上显示所有城市名称。 例如,如果用户在searchBar内键入“ New York”,则希望显示该API给我的所有结果。 我正在使用返回JSON数据的API。

现在我正在使用以下委托方法:

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
}
}

问题在于,有时它可以工作,有时却不起作用,我需要按2次搜索按钮才能看到tableView上显示的城市。 我认为缺少了一些东西,希望你们中的一些人能给我关于如何解决这个问题的建议

2 个答案:

答案 0 :(得分:2)

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

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()
        }
    }
}

答案 1 :(得分:0)

从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()
    }
相关问题