将项目添加到对象中
Posted
技术标签:
【中文标题】将项目添加到对象中【英文标题】:Adding items into Objects 【发布时间】:2017-10-12 00:52:22 【问题描述】:我希望能够将个人位置附加到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) 我建议你创建一个自己的枚举
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
【讨论】:
我无法理解 switch 语句何时执行。当cellForRowAtIndexPath被调用时,tableview的每一行都会执行switch语句对吧?我可以将 .customResult 附加到 searchResults 中;但是,当我使用搜索栏搜索时,自定义结果不显示。以上是关于将项目添加到对象中的主要内容,如果未能解决你的问题,请参考以下文章