问题描述
我尝试制作一个带有文本字段的应用程序,让用户输入位置,使用 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")
}
}
这里有几个问题:
- 我想将用户选择的项目(我在此处未能实现)转换为地址 (completion.title) -- 即,需要让用户选择建议的项目。
- 我想将建议中找到的地址转换为坐标,以便我可以在 MapView 上进行标记。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)