Добавление предметов в объекты

Я ищу возможность добавить личное местоположение в MKLocationSearchCompletionarray это может быть найдено, когда пользователь ищет через панель поиска. Однако у меня возникают проблемы с пониманием того, как элементы хранятся в объектах, и могу ли я добавить объект метки (или информацию о местоположении) в MKLocationSearch объект. Что я смог извлечь из документации, так это то, что MKLocalSearchCompleter В объекте хранятся строки, к которым осуществляется доступ, когда пользователь вводит частичные строки в строку поиска. Но я не уверен, где я могу получить доступ к этому массиву и добавить новые места.

Вот как структурирован код для отображения результатов завершения поиска:

var searchCompleter = MKLocalSearchCompleter()
var searchResults = [MKLocalSearchCompletion]()

@IBOutlet weak var searchBar: UISearchBar!

override func viewDidLoad() {
    searchCompleter.delegate = self
    searchBar.delegate = self
}

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

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

extension ViewController: 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?.attributedText = highlightedText(searchResult.title, inRanges: searchResult.titleHighlightRanges, size: 17.0)
        cell.detailTextLabel?.attributedText = highlightedText(searchResult.subtitle, inRanges: searchResult.subtitleHighlightRanges, size: 12.0)

        return cell
    }
}

extension ViewController: UISearchBarDelegate {
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        searchCompleter.queryFragment = searchText
    }

    func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool {
        self.searchBar.endEditing(true)
        searchBar.resignFirstResponder()
        return true
    }
}

1 ответ

Я не думаю, что вы можете добавить свои собственные местоположения и POI в MapKit, но:

1) Я бы посоветовал вам создать собственный enum

class CustomSearchResult {
    let title: String
    ...
}

enum SearchResultType {
    case localSearchResult(result: MKLocalSearchCompletion)
    case customResult(result: CustomSearchResult)
}

2) И у вас есть массив результатов:

var searchResults = [SearchResultType]()

3) В completerDidUpdateResults Вы можете добавить свои личные результаты и результаты MapKit в свой searchResults массив:

searchResults = completer.results.map { 
   SearchResultType.localSearchResult(result: $0) }

// Add here custom results
searchResults.append(SearchResultType.customResult(result: 
    CustomSearchResult(title: "test")))

4)..и в cellForRowAtIndexPath Вы можете решить, есть ли у вас пользовательский или MapKit результат:

let searchResult = searchResults[indexPath.row]
switch searchResult {
case .customResult(let result):
    cell.textLabel.text = result.title
case .localSearchResult(let result):
    cell.textLabel.text = result.title
}
Другие вопросы по тегам