Отображать названия городов в табличном представлении - PullRequest
0 голосов
/ 10 марта 2020

Я хотел бы отобразить все названия городов в табличном представлении в зависимости от того, что пользователь вводит в панели поиска. Например, если пользователь вводит «New York» внутри панели поиска, я хочу, чтобы отображались все результаты, которые дает мне API. Я использую API, который возвращает 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()
}
}

townsQueried - это массив, который я ранее объявил пустым в viewController Задача an состоит в сборе всех данных, полученных в результате запроса 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
}
}

Проблема в том, что когда-то это работает, а иногда нет t и мне нужно нажать 2 раза кнопку поиска, чтобы увидеть города, отображаемые в таблице. Я думаю, что-то не хватает, я надеюсь, что некоторые из вас могли бы дать мне предложение о том, как решить эту проблему

Ответы [ 2 ]

3 голосов
/ 10 марта 2020

Вам необходимо перезагрузить табличное представление в обработчике завершения асинхронной задачи

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 l oop не требуется и назовите параметр в единственном числе

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

    RequestAPI.queryCities(cityNameString: searchBar.text!) { city in          
        self.citiesQueried = city.geonames         
        DispatchQueue.main.async {
            self.tableView.reloadData()
        }
    }
}
1 голос
/ 10 марта 2020

Перезагрузить tableView после успеха из API, как показано ниже:

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