Извините за большое изображение, которое я давно не размещал на SO. В любом случае, мой UISearchController отображал результаты, создавая большой интервал между ячейками панели поиска и табличного представления. Это очень противоречивая ошибка. Как правильно отключить этот интервал при отображении результатов поиска? Спасибо!
Edit: Здесь возникает несогласованность в том, что если вы начинаете поиск, а затем отменяете, а затем выполняете другой поиск, UITableViewCells обнимает панель поиска, как и должно, без массового интервала.
введите описание изображения здесь
UISearchController Display TableView
import UIKit
import MapKit
class CustomerAddSettingsLocationSearch: UITableViewController {
weak var handleMapSearchDelegate: CustomerAddSettingsLocationSeaarching?
var matchingItems: [MKMapItem] = []
var mapView: MKMapView?
func parseAddress(selectedItem:MKMapItem) -> String {
// put a space between "4" and "Melrose Place"
let firstSpace = (selectedItem.placemark.subThoroughfare != nil &&
selectedItem.placemark.thoroughfare != nil) ? " " : ""
// put a comma between street and city/state
let comma = (selectedItem.placemark.subThoroughfare != nil || selectedItem.placemark.thoroughfare != nil) &&
(selectedItem.placemark.subAdministrativeArea != nil || selectedItem.placemark.administrativeArea != nil) ? ", " : ""
// put a space between "Washington" and "DC"
let secondSpace = (selectedItem.placemark.subAdministrativeArea != nil &&
selectedItem.placemark.administrativeArea != nil) ? " " : ""
let addressLine = String(
format:"%@%@%@%@%@%@%@",
// street number
selectedItem.placemark.subThoroughfare ?? "",
firstSpace,
// street name
selectedItem.placemark.thoroughfare ?? "",
comma,
// city
selectedItem.placemark.locality ?? "",
secondSpace,
// state
selectedItem.placemark.administrativeArea ?? ""
)
return addressLine
}
}
extension CustomerAddSettingsLocationSearch: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
guard let mapView = mapView,
let searchBarText = searchController.searchBar.text else { return }
let request = MKLocalSearch.Request()
request.naturalLanguageQuery = searchBarText
request.region = mapView.region
let search = MKLocalSearch(request: request)
search.start { response, _ in
guard let response = response else {
return
}
self.matchingItems = response.mapItems
self.tableView.reloadData()
}
}
}
extension CustomerAddSettingsLocationSearch {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return matchingItems.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
let selectedItem = matchingItems[indexPath.row]
cell.textLabel?.text = selectedItem.name
cell.detailTextLabel?.text = parseAddress(selectedItem: selectedItem)
return cell
}
}
extension CustomerAddSettingsLocationSearch {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedItem = matchingItems[indexPath.row]
handleMapSearchDelegate?.dropThePin(placemark: selectedItem)
dismiss(animated: true, completion: nil)
}
}
Код в другом контроллере представления, который отображает панель поиска и активирует отображение поиска
let locationSearchTable = storyboard!.instantiateViewController(withIdentifier: "CustomerAddSettingsLocationSearch") as! CustomerAddSettingsLocationSearch
resultSearchController = UISearchController(searchResultsController: locationSearchTable)
resultSearchController.searchResultsUpdater = locationSearchTable
let searchBar = resultSearchController!.searchBar
searchBar.sizeToFit()
searchBar.placeholder = "search custom address..."
searchBar.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
//navigationItem.titleView = resultSearchController?.searchBar
resultSearchController.hidesNavigationBarDuringPresentation = false
resultSearchController.dimsBackgroundDuringPresentation = true
definesPresentationContext = true
tableView.tableHeaderView = resultSearchController.searchBar