【问题标题】:Search for address using SWIFT使用 SWIFT 搜索地址
【发布时间】:2017-02-18 03:45:18
【问题描述】:

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

我想为用户提供 tableview 上列出的所有选项,并在用户输入他的地址时对其进行过滤。

【问题讨论】:

  • 正如公认的答案所说,这个问题是地址完成和地址验证的问题。仅供参考,如果您使用这些短语进行搜索,您会找到很好的信息。

标签: ios swift location


【解决方案1】:

你可以定义一个local search completer:

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,帕萨迪纳,CA,美国”, "300 S Orange Ave, Monterey Park, CA, United States", "300 S Orange St, Glendale, CA, United States", “300 S Orange Dr,洛杉矶,加利福尼亚州,美国”, "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, 奥兰治, CA, 美国", "300 S Orange Ave, Rialto, CA, United States", "300 S Orange Ave, Fallbrook, CA, United States", "300 S Orange St, Escondido, CA, 美国", "300 S Orange Ave, El Cajon, CA, United States", "300 S Orange Cir, Tulare, CA, United States", "300 S Orange Ave, Exeter, CA, 美国"]

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

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 属性),但您可以按照自己的方式设置这些格式。但是,假设它找到匹配项,则显示如下:

[“300 S Pumpkin Blvd,洛杉矶,CA 92108,美国”, “300 S Pumpkin Pkwy,洛杉矶,CA 92103,美国”, "300 S Pumpkin Dr, San Gabriel, CA 91776, United States"])

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

【讨论】:

  • 非常感谢,它正在按我的意愿工作,但是当我使用 MKLocalSearchRequest 时,我得到的地址最多为 10,有办法取消限制吗?
  • 不,我不这么认为。显然MKLocalSearchCompleter可以返回10多个(而且如果输入的地址不完整,我其实认为处理部分输入更好)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 2011-04-06
  • 2016-03-05
相关资源
最近更新 更多