问题描述
我有一个SwiftUi视图链接到两个视图模型。一个管理秒表,另一个管理位置信息。在某个位置,我需要知道秒表的时间。
我采用的方法是在秒表上设置一个观察器,如图所示,其下还有代码片段。
class StopWatchManager: ObservableObject {
@Published var stopWatchTime = "00:00:00.0"
static let shared = StopWatchManager()
private init() {
}
...
}
class LocationManager: NSObject,ObservableObject {
@Observedobject var stopWatch = StopWatchManager.shared
....
let time = stopWatch.stopWatchTime
....
}
它确实有效,但是这是将这两个控制器连接在一起的正确方法,以便LocationManager可以获取秒表时间吗?如果没有,什么是最佳做法?
解决方法
ObservedObject
包装器仅在SwiftUI中有效。要在其他班级的班级发布者中进行观察,您可以使用以下方法
class LocationManager: NSObject,ObservableObject {
private var time: String = "00:00:00.0"
private var cancellable: AnyCancellable?
override init() {
super.init()
cancellable = StopWatchManager.shared.$stopWatchTime
.sink { [weak self] time in
self?.time = time // << update local when remote changes
}
}
}
,
您可以在SceneDelegate中实例化该类,并将其包含为rootViewController的环境对象。
然后在视图中可以拥有: @EnvironmentObject var stopWatchManager:StopWatchManager ... 让时间= stopWatchManager.stopWatchTime