swift - 我可以在 Coordinator 中使用 ObservedObject 吗?
问题描述
我有一个使用 MKMapView 的 MapView,我有一个显示 MapView 和 ResultsCarouselView 的 HomeView(为了方便起见,现在只是用 Circle 替换它)。
如果我有一个可观察的对象来管理这个 HomeView 的状态,是否可以从协调器中使用它?例如,我在协调器中从 HomeState 调用的任何内容都不会更新 HomeView:
地图协调员
final class MapCoordinator: NSObject, MKMapViewDelegate {
@ObservedObject var homeState = HomeState()
// other code, init, etc.
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
self.homeState.setUserLocated(true)
}
}
老家:
class HomeState: NSObject, ObservableObject {
@Published var userLocated = false
func setUserLocated(_ value: Bool) {
self.userLocated = value // debugger comes here, but is this another instance or something?
}
}
主页视图:
struct HomeView: View {
@ObservedObject var homeState = HomeState()
var body: some View {
ZStack(alignment: .bottom) {
MapView()
if (homeState.userLocated) {
Circle() // this doesn't show up
}
}
}
}
解决方案
struct MapView: UIViewRepresentable {
@StateObject var homeState = HomeState()
func makeUIView(context: Context) -> MKMapView {
let mapView = MKMapView()
mapView.delegate = context.coordinator
return mapView
}
func updateUIView(_ view: MKMapView, context: Context) {
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, MKMapViewDelegate {
var parent: MapView
init(_ parent: MapView) {
self.parent = parent
}
func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
self.parent.homeState.setUserLocated(true)
}
}
}
您使用中的parent
变量Coordinator
来修改任何@State
或@ObservableObject
您的HomeState @ObservedObject
推荐阅读
- r - 尝试使用 tidyr 取消嵌套 sf 对象时出现问题
- python - 为什么这个正则表达式有效?(贪婪的量词巧妙地停止)
- c# - 在 Windows 上 Nugeting 一个多平台项目
- psychtoolbox - 等待特定时间单击鼠标右键或左键,然后继续
- google-app-engine - HTTP(S) 到特定资源的区域流量路由 - Google Cloud
- javascript - 如何在旋转的圆圈后面居中文本?
- python - 从自定义函数中保存 matplotlib
- php - 我如何在 php 中使用肥皂服务?
- python - Python - 用先前拆分的字符串替换给定目录中所有文件中的部分字符串
- c - TIM2 溢出不会触发 TIM2_IRQHandler @ STM32G031J6