Swift 3.0 Автозаполнение адреса для панели поиска

Я заинтересован в использовании tableView для перечисления возможных адресов на основе входных данных в строке поиска. После выбора ячейки, содержащей нужный адрес, текст в строке поиска состоит из адреса, однако я хочу, чтобы возможные адреса (ячейки) исчезли. Очищает ли self.searchResultsTableView.reloadData() в didSelectRowAt все ячейки или есть другая команда? Я не уверен, как очистить ячейки после выбора соответствующего адреса, не повторяя и предлагая ввести больше ячеек.

import UIKit
import MapKit

class SearchViewController: UIViewController {

@IBOutlet weak var searchBar: UISearchBar!
    var searchCompleter = MKLocalSearchCompleter()
    var searchResults = [MKLocalSearchCompletion]()
    var searchSource: [String]?



@IBOutlet weak var searchResultsTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    searchCompleter.delegate = self
    searchBar.delegate = self
}

}


extension SearchViewController: UISearchBarDelegate {

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

    searchCompleter.queryFragment = searchText
}
}

extension SearchViewController: MKLocalSearchCompleterDelegate {

func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
    searchResults = completer.results
    searchResultsTableView.reloadData()
}

func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
    // handle error
}
}

extension SearchViewController: UITableViewDataSource {

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return searchResults.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let searchResult = searchResults[indexPath.row]
    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: nil)
    cell.textLabel?.text = searchResult.title
    cell.detailTextLabel?.text = searchResult.subtitle

    return cell
}
}

extension SearchViewController: UITableViewDelegate {

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)

    let completion = searchResults[indexPath.row]

    let searchRequest = MKLocalSearchRequest(completion: completion)
    let search = MKLocalSearch(request: searchRequest)
    search.start { (response, error) in
        let coordinate = response?.mapItems[0].placemark.coordinate
        print(String(describing: coordinate))
        print(response?.mapItems)
        self.searchBar.text = response?.mapItems[0].name
    }


    self.searchResultsTableView.reloadData()


}
}

1 ответ

Решение

Если вы хотите очистить свой tableView, вам нужно сделать пустой массив источника данных, а затем перезагрузить tableView.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath, animated: true)

    let completion = searchResults[indexPath.row]

    let searchRequest = MKLocalSearchRequest(completion: completion)
    let search = MKLocalSearch(request: searchRequest)
    search.start { (response, error) in
        let coordinate = response?.mapItems[0].placemark.coordinate
        print(String(describing: coordinate))
        print(response?.mapItems)
        self.searchBar.text = response?.mapItems[0].name
    }

    //Make empty your array ant then reload tableView
    searchResults = []
    self.searchResultsTableView.reloadData()
}
Другие вопросы по тегам