使用MklocalsearchCompleter搜索位置名称(城市/城镇)



我正在尝试构建一个自动完整的文本场,该文字场仅需要显示城市/城镇名称。

所以我想做的是,当某人进入

Am它将显示

阿姆斯特丹
Amstelveen

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

我已经应用了一个过滤器,但是这没有修复。

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

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

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

iOS本机框架中的另一个选择是利用相关的MklocalsearchRequest并提取"局部"字段,该字段最与城市/城镇非常紧密。这篇文章提供了有关沿着这条路线的更多信息:

如何从mklocalsearchcompletion中提取乡村和城市?

话虽如此,我确实使用Mklocalsearch completion进行了一些进展,通过在返回的结果中解析标题属性以检查"逗号"字符。逗号的存在表明,到第一个逗号的整个弦都是一个城镇,城市或州。下面的简单示例获取TextField输入,并仅返回tableview中的过滤结果。

我必须指出,它似乎对美国的城市工作得很好,因为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
    }
}

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

相关内容

  • 没有找到相关文章

最新更新