在 SwiftUI 小部件中添加观察者的位置
Posted
技术标签:
【中文标题】在 SwiftUI 小部件中添加观察者的位置【英文标题】:Where to add observers in SwiftUI widget 【发布时间】:2020-10-04 20:48:07 【问题描述】:我正在尝试构建一个更好的小部件,我希望每次电池状态或电量变化时都刷新小部件。我知道两者都需要添加通知。所以我的逻辑是当关于电池状态的通知发生变化时我想刷新时间线。
但是我无法理解在 TimelineProvider 或 Widget 视图下放置观察者的位置?
struct timeWidgetEntryView : View
var entry: Provider.Entry
let NC = NotificationCenter.default
init(entry:Provider.Entry)
self.entry = entry
func batteryLevelDidChange(_ notification: Notification)
UIDevice.current.isBatteryMonitoringEnabled = true
var level = UIDevice.current.batteryLevel
level = level * 100
WidgetCenter.shared.reloadAllTimelines()
NSLog("Level changed / state changed")
var body: some View
VStack
Text(entry.date, style: .time).foregroundColor(.black).frame(minWidth: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealWidth: 100, maxWidth: 100, minHeight: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealHeight: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, maxHeight: 50, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
Text("Battery : \(entry.batteryState)").foregroundColor(.black).frame(minWidth: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealWidth: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, maxWidth: /*@START_MENU_TOKEN@*/.infinity/*@END_MENU_TOKEN@*/, minHeight: /*@START_MENU_TOKEN@*/0/*@END_MENU_TOKEN@*/, idealHeight: /*@START_MENU_TOKEN@*/100/*@END_MENU_TOKEN@*/, maxHeight: 50, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
.cornerRadius(10)
.frame(width:.infinity, height:.infinity, alignment: .center)
.onReceive(NotificationCenter.default.publisher(for: UIDevice.batteryStateDidChangeNotification))
obj in
// Change key as per your "userInfo"
if let userInfo = obj.userInfo, let info = userInfo["info"]
print(info)
WidgetCenter.shared.reloadAllTimelines()
但它没有按预期工作,所以我的问题是我应该将观察者转移到时间线提供者吗?如果有,在哪里?
【问题讨论】:
【参考方案1】:您需要改为在主应用程序中收听通知 - 如 Apple 教程中所述:
Keeping a Widget Up To Date然后,当您收到UIDevice.batteryStateDidChangeNotification
时,只需致电:
WidgetCenter.shared.reloadAllTimelines()
要在您的应用不可见时继续收到通知,您可能需要启用后台通知。看到这个帖子:
Check battery level in background?【讨论】:
以上是关于在 SwiftUI 小部件中添加观察者的位置的主要内容,如果未能解决你的问题,请参考以下文章
使用 GetX 可观察对象时,哪些 UI 小部件需要包装在 Obx 中?
如何删除所有以前注册的小部件事件处理程序(使用观察或 on_click 注册)