Swift - Отображаются результаты UISearchController Большой интервал между панелью поиска и ячейками TableView - PullRequest
0 голосов
/ 13 июля 2020

Извините за большое изображение, которое я давно не размещал на 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
...