使用SWIFT搜索地址 [英] Search for address using SWIFT

查看:110
本文介绍了使用SWIFT搜索地址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用中,我需要用户输入他的家庭住址,但我无法以任何方式确保所显示的地址仅在用户区域内,并且是完整地址,例如225e 57th st, NY, New York.

In my app I need the user to enter his home address, but I can't get any way that the addresses that are shown are only in the users region, and are full addresses, like 225e 57th st, NY, New York.

我想为用户提供表格视图中所有列出的选项,并在用户输入其地址时对其进行过滤.

I want to give the user all the listed options on a tableview, and to filter them as the user enters his address.

推荐答案

您可以定义本地搜索完成器:

let completer = MKLocalSearchCompleter()

然后提供查询片段:

completer.delegate = self
completer.region = MKCoordinateRegion(center: currentCoordinate, latitudinalMeters: 10_000, longitudinalMeters: 10_000)
completer.queryFragment = "300 S Orange"

并实施MKLocalSearchCompleterDelegate协议

extension ViewController: MKLocalSearchCompleterDelegate {

    func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
        let addresses = completer.results.map { result in
            result.title + ", " + result.subtitle
        }

        // use addresses, e.g. update model and call `tableView.reloadData()
    }

}

结果是:


["300 S Orange Grove Blvd, Pasadena, CA, United States",
 "300 S Orange Ave, Monterey Park, CA, United States",
 "300 S Orange St, Glendale, CA, United States",
 "300 S Orange Dr, Los Angeles, CA, United States",
 "300 S Orange Ave, Azusa, CA, United States",
 "300 S Orange Grove Ave, Los Angeles, CA, United States",
 "300 S Orange Ave, Brea, CA, United States",
 "300 S Orange Ave, Fullerton, CA, United States",
 "300 S Orange St, Orange, CA, United States",
 "300 S Orange Ave, Rialto, CA, United States",
 "300 S Orange Ave, Fallbrook, CA, United States",
 "300 S Orange St, Escondido, CA, United States",
 "300 S Orange Ave, El Cajon, CA, United States",
 "300 S Orange Cir, Tulare, CA, United States",
 "300 S Orange Ave, Exeter, CA, United States"]


否则,您可以进行本地搜索:


Or else, you can do a local search:

let request = MKLocalSearch.Request()
request.region = MKCoordinateRegion(center: currentCoordinate, latitudinalMeters: 10_000, longitudinalMeters: 10_000)
request.naturalLanguageQuery = "300 S Pumpkin"

let formatter = CNPostalAddressFormatter()
formatter.style = .mailingAddress

let search = MKLocalSearch(request: request)
search.start { response, error in
    let addresses = response?.mapItems.compactMap { item -> String? in
        return item.placemark.postalAddress.flatMap {
            formatter.string(from: $0).replacingOccurrences(of: "\n", with: ", ")
        }
    }
    print(addresses)
}

现在,我使用的是Contacts框架的格式化程序(该格式化程序还会在地标上显示postalAddress属性),但是您可以根据需要设置其格式.但是,假设找到匹配项,则显示类似以下内容:

Now, I’m using the Contacts framework’s formatter (which also exposes the postalAddress property on the placemark), but you can format these any way you want. But, assuming it finds matches, that shows something like:


["300 S Pumpkin Blvd, Los Angeles, CA  92108, United States",
 "300 S Pumpkin Pkwy, Los Angeles, CA  92103, United States",
 "300 S Pumpkin Dr, San Gabriel, CA  91776, United States"])

现在,是要使用FormattedAddressLines还是从addressDictionary中提取单个组件,由您决定,但是希望这可以说明这个想法.

Now, whether you want the FormattedAddressLines, or extract the individual components from the addressDictionary is up to you, but hopefully this illustrates the idea.

这篇关于使用SWIFT搜索地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆