这是允许其他视图模式访问视图模型属性的正确方法吗?

问题描述

我有一个SwiftUi视图链接到两个视图模型。一个管理秒表,另一个管理位置信息。在某个位置,我需要知道秒表的时间。

我采用的方法是在秒表上设置一个观察器,如图所示,其下还有代码片段。

enter image description here

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