2017-10-12 98 views
9

我期望能夠將個人位置追加到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 
    } 
} 

回答

4

我不認爲你可以添加自己的位置和興趣點到MapKit,但:

1)I建議你創建自己的枚舉

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

我無法理解何時執行switch語句。當調用cellForRowAtIndexPath時,tableview的每一行都會執行switch語句嗎?我可以將.customResult附加到searchResults中;但是,當我使用搜索欄進行搜索時,自定義結果不顯示。 – Kevin