我正在構建一個 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 并
didReceiveUserInfo在 Watch 應用中接收,iOS 應用中的 Slider 視圖更新得很好。從 Watch 應用發送“compensationValue”UserInfo 并在 iOS 應用中接收,
didReceiveUserInfoiOS 應用中的 Slider 視圖更新得很好。
問題:
- 現在,當我重復第二步,即從 iOS 應用程式向 Watch 應用程式發送“compensationValue”UserInfo 時,
CompactSlider不會更新。
就像一次@Published var sliderValue = 0.0是由 撰寫的CompactSlider,它在由 更新時不會更新視圖didReceiveUserInfo。
uj5u.com熱心網友回復:
添加private到這一行
private init(session: WCSession = .default){
如果您的代碼中有一個區域您沒有使用相同的實體,它將暴露出來。
您應該只使用ViewModelWatch.shared它們,以便他們可以共享資訊。
另一個呼叫ViewModelWatch()將與ViewModelWatch.shared
uj5u.com熱心網友回復:
嘗試在主佇列上分配值,例如
func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
DispatchQueue.main.async {
self.sliderValue = userInfo["compensationValue"] as? Double ?? 0.0
}
}
MainActor如果部署目標版本允許,則制作視圖模型
@MainActor
class ViewModelWatch
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/497540.html
