微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我有一个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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。