watchOS - 如何从扩展委托更新 SwiftUI 视图

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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) 添加到我的列表中,以便每次打开应用程序时都会刷新

以上是关于watchOS - 如何从扩展委托更新 SwiftUI 视图的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Swift 扩展实现委托方法

本地通知不适用于独立 WatchOS 应用程序

Swift:UIViewController 实例未从 URLSession 委托方法接收更新

更新仅 watchOS 的应用程序“生成的 iOS”plist?

Swift App 委托->ViewController Cocoa

如何在Swift 4中的watchOS 4上激活振动