2017-10-12 23 views
9

Tôi đang tìm cách có thể thêm một vị trí cá nhân vào MKLocationSearchCompletionarray mà sẽ có thể được tìm thấy khi người dùng tìm kiếm thông qua thanh tìm kiếm. Tuy nhiên, tôi gặp sự cố khi hiểu cách các mục được lưu trữ vào các đối tượng và liệu tôi có thể thêm đối tượng dấu vị trí (hoặc thông tin vị trí) vào đối tượng MKLocationSearch hay không. Những gì tôi đã có thể thu được từ tài liệu là đối tượng MKLocalSearchCompleter lưu các chuỗi được truy cập khi người dùng nhập các chuỗi một phần vào thanh tìm kiếm. Nhưng tôi không chắc chắn nơi tôi có thể truy cập mảng này và thêm vị trí mới.Thêm các mục vào các Đối tượng

Sau đây là cách mã được cấu trúc để hiển thị kết quả tìm kiếm hoàn thành:

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

Trả lời

4

Tôi không nghĩ rằng bạn có thể thêm địa điểm và POI của riêng bạn để MapKit, nhưng:

1) Tôi sẽ đề nghị bạn tạo một enum riêng

class CustomSearchResult { 
    let title: String 
    ... 
} 

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

2) Và bạn có mảng của bạn kết quả:

var searchResults = [SearchResultType]() 

3) Trong completerDidUpdateResults bạn có thể thêm kết quả cá nhân của bạn và kết quả MapKit vào searchResults mảng của bạn:

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

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

4) ..và trong cellForRowAtIndexPath bạn có thể quyết định xem bạn có kết quả tùy chỉnh hoặc 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

Tôi không hiểu khi nào câu lệnh chuyển đổi được thực hiện. Khi cellForRowAtIndexPath được gọi, mỗi hàng của tableview sẽ thực thi câu lệnh switch phải không? Tôi có thể nối thêm .customResult vào searchResults; tuy nhiên khi tôi đang tìm kiếm bằng thanh tìm kiếm, kết quả tùy chỉnh sẽ không hiển thị. – Kevin

Các vấn đề liên quan