结合 MKLocalSearchCompleter 和 CoreLocation

问题描述

我尝试制作一个带有文本字段的应用程序,让用户输入位置,使用 MKLocalSearchCompleter 完成搜索。之后我想获取坐标并显示在 MapKit 上。但是,我无法使用地理编码器获取坐标。

class LocationSearchService: NSObject,ObservableObject,MKLocalSearchCompleterDelegate {
    @Published var searchQuery = ""
    var completer: MKLocalSearchCompleter
    @Published var completions: [MKLocalSearchCompletion] = []
    var cancellable: AnyCancellable?
    
    override init() {
        completer = MKLocalSearchCompleter()
        super.init()
        cancellable = $searchQuery.assign(to: \.queryFragment,on: self.completer)
        completer.delegate = self
    }
    
    func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
        self.completions = completer.results
    }
}

位置管理器如下:

class LocationManager: NSObject,ObservableObject {
    
    private let locationManager = CLLocationManager()
    private let geocoder = CLGeocoder()
    
    let objectwillChange = PassthroughSubject<Void,Never>()
    
    @Published var status: CLAuthorizationStatus? {
        willSet { objectwillChange.send() }
    }
    
    @Published var location: CLLocation? {
        willSet { objectwillChange.send() }
    }
    
    override init() {
        super.init()
        
        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()
    }
    
    @Published var placemark: CLPlacemark? {
        willSet { objectwillChange.send() }
    }
    
    private func lookupLocation() {
        guard let location = self.location else { return }
        geocoder.reverseGeocodeLocation(location,completionHandler: { (places,error) in
            if error == nil {
                self.placemark = places?[0]
            } else {
                self.placemark = nil
            }
        })
    }
    
    // !!! This is the function I would like to use to get the Coordinate from the address obtained from LocationSearchService
    func getCoordinate(address: String) {
        geocoder.geocodeAddressstring(address,error) in
            if error == nil {
                self.placemark = places?[0]
                self.location = self.placemark?.location
            } else {
                self.placemark = nil
                self.location = nil
            }
        })
    }
    
}

extension LocationManager: CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager,didChangeAuthorization status: CLAuthorizationStatus) {
        self.status = status
    }
    
    func locationManager(_ manager: CLLocationManager,didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.last else { return } //.first or .last?
                    
        self.location = location
        self.lookupLocation()
    }
}

内容视图如下:

struct ContentView: View {
    
    @State private var location: String = ""
    
    @Observedobject var lm = LocationManager()
    
    private let completer = MKLocalSearchCompleter()
        
    @Observedobject var locationSearchService = LocationSearchService()
    
    var body: some View {
        
        NavigationView {
            vstack {
                AddressSearchBar(text: $locationSearchService.searchQuery)
                List(locationSearchService.completions,id: \.self) { completion in
                    vstack(alignment: .leading) {
                        Text(completion.title)    
                    
                        // Error here,I cannot translate the address to location 
                        //Text(lm.getCoordinate(address: completion.title))
                    }
                }.navigationTitle("Search Location")
            }
        }

这里有几个问题:

  1. 我想将用户选择的项目(我在此处未能实现)转换为地址 (completion.title) -- 即,需要让用户选择建议的项目。
  2. 我想将建议中找到的地址转换为坐标,以便我可以在 MapView 上进行标记

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...