[英]Published object not being updated
我正在構建一個 WatchOS 配套應用程序。 在視圖中有一個可以讀取和寫入值的滑塊。 此值正在 iOS 和 WatchOS 應用程序之間進行通信。
struct ReadingView: View {
@EnvironmentObject var watcher: ViewModelWatch
var body: some View {
CompactSlider(value: $watcher.sliderValue, in: -1000...1000, step: 50, direction: .center) {
VStack {
Text("Compensation")
Text(String(format: "%.0fK", watcher.sliderValue))
}
}
.onChange(of: watcher.sliderValue) { newValue in
ViewModelWatch.shared.session.transferUserInfo(["compensationValue": newValue])
}
}
}
這就是我的模型的樣子:
class ViewModelWatch : NSObject, WCSessionDelegate, ObservableObject {
static let shared = ViewModelWatch()
var session: WCSession = .default
@Published var sliderValue = 0.0
init(session: WCSession = .default){
self.session = session
super.init()
self.session.delegate = self
session.activate()
}
func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
self.sliderValue = userInfo["compensationValue"] as? Double ?? 0.0
}
}
步驟和發生了什么:
在 iOS 和 WatchOS 上運行應用程序。
從 iOS 應用發送“compensationValue”UserInfo 並在 Watch 應用的didReceiveUserInfo
中接收,iOS 應用中的 Slider 視圖更新得很好。
從 Watch 應用程序發送“compensationValue”UserInfo 並在 iOS 應用程序的didReceiveUserInfo
中接收,iOS 應用程序中的 Slider 視圖更新得很好。
問題:
CompactSlider
不會更新。 就像一旦@Published var sliderValue = 0.0
由CompactSlider
編寫,當由didReceiveUserInfo
更新時它不會更新視圖。
將private
添加到此行
private init(session: WCSession = .default){
如果您的代碼中有一個區域您沒有使用相同的實例,它將暴露出來。
您應該只使用ViewModelWatch.shared
以便他們可以共享信息。
ViewModelWatch()
的另一個調用將與ViewModelWatch.shared
分開
嘗試在主隊列上分配值,例如
func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
DispatchQueue.main.async {
self.sliderValue = userInfo["compensationValue"] as? Double ?? 0.0
}
}
或者如果部署目標版本允許,則制作視圖模型MainActor
@MainActor
class ViewModelWatch
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.