Попытка поднять UIViewController и MapKit - PullRequest
0 голосов
/ 25 декабря 2018

Итак, я пытаюсь создать приложение для календаря.В этом приложении оно позволяет пользователям указывать местоположение в своих событиях для времени в пути (аналогично тому, как это делают карты iOS). Однако у меня возникают проблемы с заполнением ListView, который у меня есть под TextField ... ниже приведен коди результат.

Код для обновления ListView:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        cell = self.tableView.dequeueReusableCell(withIdentifier: "cell") as! CustomTableViewCell
        let request = MKLocalSearch.Request()
        request.naturalLanguageQuery = locationSearchTextField.text
        request.region = mapKitView.region
        let search = MKLocalSearch(request: request)
        search.start(completionHandler: {(response, error) in
            if error != nil{
                print("Error occured during search:")
                print(error!.localizedDescription)
                numberOfResults = 0
                tableView.isHidden = true
                return
            }else if response!.mapItems.count == 0{
                print("No results found")
                numberOfResults = 0
                tableView.isHidden = true
                return
            }else{
                print("Results found")
                matchingItems = (response?.mapItems)!
                numberOfResults = matchingItems.count
                tableView.numberOfRows(inSection: numberOfResults)
                print(numberOfResults)
                let indexRow = indexPath.row
                let matchingItemsCount = matchingItems.count
                if(matchingItemsCount > indexRow){
                cell.nameLabel.text = matchingItems[indexRow].placemark.name
                }else{
                    return
                }
            }
        })
    return cell
}

Код для отслеживания того, когда пользователь редактирует TextField (этот код используется для обновления ListView):

@IBAction func locationTextFieldChanged(_ sender: Any) {
    tableView.reloadData()
    tableView.isHidden = false
}

результат: result

1 Ответ

0 голосов
/ 25 декабря 2018

Попробуйте выполнить этот вызов во внешней функции, такой как: Каждый раз, когда вы делаете вызов, если у вас есть результаты, обновляйте свой массив, а затем вызывайте tableView.reloadData() в конце, чтобы он создал необходимые ячейки для вас.

func makeSearchCall() {
    let request = MKLocalSearch.Request()
    request.naturalLanguageQuery = locationSearchTextField.text
    request.region = mapKitView.region
    let search = MKLocalSearch(request: request)
    search.start(completionHandler: {(response, error) in
        if error != nil{
            print("Error occured during search:")
            print(error!.localizedDescription)
            numberOfResults = 0
            tableView.isHidden = true
            return
        }else if response!.mapItems.count == 0{
            print("No results found")
            numberOfResults = 0
            tableView.isHidden = true
            return
        }else{
            print("Results found")
            matchingItems = (response?.mapItems)!
            numberOfResults = matchingItems.count
            tableView.numberOfRows(inSection: numberOfResults)
            tableView.reloadData()
        }
    })
}

Тогда в вашем cellForRowAt методе:

guard let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell") as? CustomTableViewCell else {return UITableViewCell()}
cell.nameLabel.text = matchingItems[indexPath.row].placemark.name
return cell

Также в вашем numberOfRowsInSection методе:

return matchingItems.count
...