2017-10-12 78 views
9

Czekam na możliwość dołączenia osobistej lokalizacji do MKLocationSearchCompletionarray, którą można znaleźć, gdy użytkownik przeszukuje pasek wyszukiwania. Mam jednak problem ze zrozumieniem, jak elementy są przechowywane w obiektach i czy mogę dodać obiekt oznaczenia miejsca (lub informacje o lokalizacji) do obiektu MKLocationSearch. To, co udało mi się uzyskać z dokumentacji, polega na tym, że obiekt MKLocalSearchCompleter przechowuje łańcuchy, do których uzyskuje się dostęp, gdy użytkownik wpisuje częściowe ciągi znaków w pasku wyszukiwania. Ale nie jestem pewien, gdzie mogę uzyskać dostęp do tej tablicy i dodawać nowe lokalizacje.Dodawanie elementów do obiektów

Oto jak kod jest tak skonstruowane, aby wyświetlić wyniki ukończenia Szukaj:

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 
    } 
} 

Odpowiedz

4

Nie sądzę, że można dodawać własne lokalizacje oraz POI do MapKit, ale:

1) I sugerowałaby utworzyć własne wyliczenia

class CustomSearchResult { 
    let title: String 
    ... 
} 

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

2) I masz swoją tablicę wyników:

var searchResults = [SearchResultType]() 

3) W completerDidUpdateResults można dodać swoje rezultaty i wyniki MapKit do swojej searchResults tablicy:

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

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

4) ..i w cellForRowAtIndexPath można zdecydować, czy masz niestandardową lub MapKit wynik:

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 
} 
+0

Mam problemy ze zrozumieniem, kiedy wykonywana jest instrukcja switch. Kiedy wywoływana jest funkcja cellForRowAtIndexPath, każdy wiersz widoku table wykona instrukcję switch right? Jestem w stanie dodać .customResult do searchResults; jednak gdy szukam z paska wyszukiwania, wynik niestandardowy się nie pojawia. – Kevin