我有一个相当标准的位置管理器服务来控制地图视图 - 该服务在应用程序加载时显示。我还有视图模型,其中包含仅限于地图当前区域的地图注释(它们是使用 GeoFire 有条件地从 FireStore 加载的)。
位置管理器和视图模型都被注入到地图入口点的环境中,如下所示:
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(LocationManager())
.environmentObject(VenuesViewModel())
}
}
我正在寻找一种方法,在给出位置权限后触发视图模型更新/填充,否则第一次使用时它是空的,直到用户切换视图(在这种情况下,在
中调用获取注释的函数) onAppear
)或点击按钮,但不是在应用程序可以使用当前位置之后。
我尝试在
locationManagerDidChangeAuthorization
内调用更新函数,但收到错误“精度必须小于 23”。
非常感谢有关在正确的时间和地点调用函数来更新视图模型的任何提示。
要在用户授予位置权限后触发视图模型更新/填充,可以按照以下步骤操作:
.onChange
修饰符观察 LocationManager 中的授权状态变化。当授权状态变为.authorizedAlways
或.authorizedWhenInUse
时,可以调用该函数更新视图模型。.environmentObject(LocationManager())
.onChange(of: locationManager.authorizationStatus) { status in
if status == .authorizedAlways || status == .authorizedWhenInUse {
// Call the function to update the view model here
// For example:
venuesViewModel.updateAnnotations()
}
}
.environmentObject(VenuesViewModel())
locationManagerDidChangeAuthorization
委托方法中更新它。class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
@Published var authorizationStatus: CLAuthorizationStatus = .notDetermined
private let locationManager = CLLocationManager()
override init() {
super.init()
locationManager.delegate = self
}
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
authorizationStatus = manager.authorizationStatus
}
// ...
}
这样,当用户授予位置权限时,ContentView 中的
.onChange
修饰符将检测授权状态的变化,并调用该函数来更新视图模型,确保它填充当前位置的注释。
确保您还拥有在 Info.plist 文件中正确设置的必要权限和密钥,以访问用户的位置。