【问题标题】:Search for Place Names (City/Town) Using MKLocalSearchCompleter使用 MKLocalSearchCompleter 搜索地名(城市/城镇)
【发布时间】:2017-04-19 10:23:38
【问题描述】:

我正在尝试构建一个只需要显示城市/城镇名称的自动完成文本字段。

所以我想做的是当有人进入时

Am 会显示

阿姆斯特丹
阿姆斯特尔芬

所以它只会显示实际的城市名称,除此之外什么都没有。它不需要考虑地方社区等。

我已经应用了过滤器,但这并不能解决问题。

lazy var searchCompleter: MKLocalSearchCompleter = {
        let sC = MKLocalSearchCompleter()
        sC.delegate = self
        sC.filterType = .locationsOnly
        return sC
    }()

func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
        self.searchSource = completer.results.map { $0.title }
        DispatchQueue.main.async {
            for result in self.searchSource! {
                print(result)
            }
        }
    }

    func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
        print(error.localizedDescription)
    }

有人知道是否有可能实现我想要的吗?

【问题讨论】:

  • 告诉我你在哪里传递'queryFragment',这取决于它
  • 它还会以 'MKLocalSearchCompletion' 的形式给出结果,它只有 'title' 和 'subtitle' 属性。所以你只能使用它,如果你只想要城市名称,那么它是不可能的
  • MKLocalSearchCompleter 将给出完整的地址......不仅仅是单个城市名称

标签: ios swift swift3 mapkit mklocalsearchrequest


【解决方案1】:

我一直在寻找一种在我的一个应用程序中执行此操作的方法,但 MKLocalSearchCompletion 似乎并不是解决此问题的理想工具。使用 Google 的 Map API 或仅使用城市名称的本地数据库可能会更简单。

iOS 原生框架中的另一个选项是使用相关的 MKLocalSearchRequest 并提取最接近城市/城镇的“locality”字段。这篇文章提供了有关沿着这条路线走的更多信息:

How to extract country and city from MKLocalSearchCompletion?

话虽如此,我只使用 MKLocalSearchCompletion 确实取得了一些进展,方法是解析返回结果中的 title 属性以检查“逗号”字符。逗号的存在表示直到第一个逗号的整个字符串是城镇、城市或州。下面的简单示例采用文本字段输入并仅在表格视图中返回过滤后的结果。

我必须指出,它似乎适用于美国的城市,因为 MKLocalSearchCompletion 数据库对于该地区来说似乎更加完整。一些国际城市没有显示,因为结果与此方法使用的“逗号”格式不同。

import UIKit
import MapKit

class ViewController: UIViewController, MKLocalSearchCompleterDelegate, UITableViewDelegate, UITableViewDataSource {

    var completer = MKLocalSearchCompleter()

    var completionResults: [MKLocalSearchCompletion] = []

    var cityResults: [String] = [] {
        didSet {
            citySearchTable.reloadData()
        }
    }

    @IBOutlet weak var citySearchTable: UITableView!

    @IBAction func cityTextChanged(_ sender: UITextField) {
        completer.queryFragment = sender.text!
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        let coordUSA = CLLocationCoordinate2DMake(39.999733,-98.678503);

        completer.region = MKCoordinateRegion(center: coordUSA, latitudinalMeters: 1, longitudinalMeters: 1)

        completer.delegate = self
        citySearchTable.delegate = self
        citySearchTable.dataSource = self
    }

    func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
        completionResults = completer.results
        completionResults = completionResults.filter({ (result) -> Bool in
            return result.title != ""
        })
        if completionResults.count > 0 {
            var newResults: [String] = []
            for result in completionResults {
                if result.title.contains(",") {
                    let splitByComma = result.title.components(separatedBy: ",")
                    if splitByComma.count > 0 {
                        if !newResults.contains(splitByComma[0]) {
                            newResults.append(splitByComma[0])
                        }
                    }
                }
            }
            if newResults.count > 0 {
                cityResults = newResults
            }
        }
    }

    func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) {
        //
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cityResults.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = citySearchTable.dequeueReusableCell(withIdentifier: "cell")!
        cell.textLabel?.text = cityResults[indexPath.row]
        cell.textLabel?.adjustsFontSizeToFitWidth = true
        return cell
    }

}

我知道这篇文章已经有几年的历史了,但它确实出现在我最近的研究中,并且与我目前的工作相关,所以我想我会发布我想出的东西。

【讨论】:

  • 关于谷歌:读者应该知道谷歌不允许在非谷歌地图上显示谷歌搜索结果或方向。所以使用 googleas 搜索意味着你必须使用 googles 地图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
相关资源
最近更新 更多