相关疑难解决方法(0)

当城市名称等于某个国家/地区的名称时,CLGeocoder会返回错误的结果(而不仅仅是)

在我的一个应用程序中,我需要添加一个按名称查找城市的功能.我正在使用它CLGeocoder来实现这一点,我希望它具有与iOS天气应用程序相同的行为.

以下是我的代码:

CLGeocoder().geocodeAddressString(searchBar.text!, completionHandler:{ (placemarks, error) -> Void in
    guard let nonNilMarks = placemarks else {return}
    for placemark in nonNilMarks {
        print("locality: \(placemark.locality)")
        print("name: \(placemark.name)")
        print("country: \(placemark.country)")
        print("formatted address: \(placemark.addressDictionary)")
    }
})
Run Code Online (Sandbox Code Playgroud)

它在大多数情况下都能很好地工作.但是,我最近注意到一些失败的情况.以下是一些示例的输出:

寻找'米兰' - 工作

locality: Optional("Milan")
name: Optional("Milan")
country: Optional("Italy")
formatted address: Optional([SubAdministrativeArea: Milan, State: Lombardy, CountryCode: IT, Country: Italy, Name: Milan, FormattedAddressLines: (
    Milan,
    Italy
), City: Milan])
Run Code Online (Sandbox Code Playgroud)

这是正确的输出

寻找'意大利,德克萨斯州' - 工作

德克萨斯州有一个叫意大利的小镇.如果我键入'Italy,TX',则输出为:

locality: Optional("Italy")
name: Optional("Italy")
country: Optional("United States")
formatted address: Optional([SubAdministrativeArea: Ellis, State: …
Run Code Online (Sandbox Code Playgroud)

objective-c ios clgeocoder swift swift2

16
推荐指数
1
解决办法
3423
查看次数

SwiftUI 使用 MapKit 实现地址自动完成

我有一个表格,用户可以在其中输入他们的地址。虽然他们总是可以手动输入,但我还想为他们提供一种具有自动完成功能的简单解决方案,以便他们可以开始输入地址,然后从列表中点击正确的地址并让它自动填充各个字段。

我首先使用 jnpdx 的 Swift5 解决方案 - /sf/answers/4699196351/

但是,有两个问题我似乎无法解决:

  1. 我需要将结果仅限于美国(不仅仅是美国大陆,而是整个美国,包括阿拉斯加、夏威夷和波多黎各)。我知道 MKCooperativeRegion 如何与中心点一起使用,然后缩放扩展,但它似乎不适用于地址搜索的结果。

  2. 结果的返回仅提供标题和副标题,我需要实际提取所有单独的地址信息并填充我的变量(即地址、城市、州、邮政编码和邮政编码分机号)。如果用户有公寓号或套房号,他们会自己填写。我的想法是创建一个在点击按钮时运行的函数,以便根据用户的选择分配变量,但我不知道如何提取所需的各种信息。苹果的文档一如既往地糟糕,我还没有找到任何解释如何做到这一点的教程。

这是针对最新的 SwiftUI 和 XCode (ios15+)。

我创建了一个用于测试的虚拟表单。这是我所拥有的:

import SwiftUI
import Combine
import MapKit

class MapSearch : NSObject, ObservableObject {
    @Published var locationResults : [MKLocalSearchCompletion] = []
    @Published var searchTerm = ""
    
    private var cancellables : Set<AnyCancellable> = []
    
    private var searchCompleter = MKLocalSearchCompleter()
    private var currentPromise : ((Result<[MKLocalSearchCompletion], Error>) -> Void)?
    
    override init() {
        super.init()
        searchCompleter.delegate = self
        searchCompleter.region = MKCoordinateRegion()
        searchCompleter.resultTypes = MKLocalSearchCompleter.ResultType([.address])
        
        $searchTerm
            .debounce(for: .seconds(0.5), scheduler: …
Run Code Online (Sandbox Code Playgroud)

mapkit mkcoordinateregion mklocalsearch swiftui

10
推荐指数
1
解决办法
5042
查看次数