将项目添加到对象中

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 中;但是,当我使用搜索栏搜索时,自定义结果不显示。

以上是关于将项目添加到对象中的主要内容,如果未能解决你的问题,请参考以下文章

为啥将项目添加到空白数组中会重复显示项目?

将项目添加到 Mongoose 中的多维对象数组

将项目添加到 Mongoose 中的多维对象数组

面向对象将项目添加到 arrayList

Angular 6 ngrx,如何将新项目添加到状态对象的数组中?

如何在 django rest 框架中仅使用特定变体对象将项目添加到愿望清单?