Добавление предметов в объекты
Я ищу возможность добавить личное местоположение в MKLocationSearchCompletion
array
это может быть найдено, когда пользователь ищет через панель поиска. Однако у меня возникают проблемы с пониманием того, как элементы хранятся в объектах, и могу ли я добавить объект метки (или информацию о местоположении) в 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
}