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

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

最佳答案

您可以定义一个 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 协议(protocol)
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 属性),但您可以按您想要的任何方式对其进行格式化。但是,假设它找到匹配项,它会显示如下内容:

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

现在,您是否想要 FormattedAddressLines ,或者从 addressDictionary 中提取单个组件取决于您,但希望这说明了这个想法。

关于ios - 使用 SWIFT 搜索地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39946100/

10-10 20:57
查看更多