【问题标题】:watchOS - How to update a SwiftUI view from extension delegatewatchOS - 如何从扩展委托更新 SwiftUI 视图
【发布时间】:2019-08-26 14:11:30
【问题描述】:

我有一个独立的手表应用程序,可以全天跟踪用户的卡路里。 因此,当我第一次通过 Xcode 构建和运行应用程序时,会调用视图的 onAppear(_:) 方法,并从 HealthKit 存储库中正确检索卡路里。

每当我在 5 分钟后放下手并抬起手腕时,ExtensionDelegate 方法的 applicationDidBecomeActive 被调用,但 SwiftUI 视图的 onAppear(_:) 方法没有被调用(我的 HealthKit 代码用于获取卡路里被调用在这个函数中)和屏幕显示的卡路里数与应用程序上一次运行 Xcode 时相同。

这是预期的行为吗?如果是,那么如何通过 Extension Delegate 更新我的 SwiftUI 视图?

【问题讨论】:

    标签: watchkit swiftui watchos


    【解决方案1】:

    我认为在抬腕时调用 .onAppear 失败是一个错误,我对此提交了反馈。与此同时,我把它作为一个“举手”活动。

    // ExtensionDelegate.swift
    
    extension Notification.Name {
        static var applicationIsActive: Notification.Name {
          Notification.Name("applicationIsActive")
        }
    }
    
    class ExtensionDelegate: NSObject, WKExtensionDelegate {
        func applicationDidBecomeActive() {
          NotificationCenter.default.post(name: .applicationIsActive, object: nil)
        }
    }
    
    // ContentView.swift
    
    private var isActive = NotificationCenter.default.publisher(for: .applicationIsActive)
    
    .onReceive(isActive) {_ in self.viewModel.refresh()}
    

    【讨论】:

    • 太好了,我会试试这个,让你知道结果
    • 感谢我能够使用此代码和 @State var listID: String 然后为 listID 生成一个随机代码并将 .id(listID) 添加到我的列表中,以便每次打开应用程序时都会刷新
    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多