簡體   English   中英

已發布的對象未更新

[英]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        
    }
}

步驟和發生了什么:

  1. 在 iOS 和 WatchOS 上運行應用程序。

  2. 從 iOS 應用發送“compensationValue”UserInfo 並在 Watch 應用的didReceiveUserInfo中接收,iOS 應用中的 Slider 視圖更新得很好。

  3. 從 Watch 應用程序發送“compensationValue”UserInfo 並在 iOS 應用程序的didReceiveUserInfo中接收,iOS 應用程序中的 Slider 視圖更新得很好。

問題:

  1. 現在,當我重復第二步,即從 iOS 應用程序向 Watch 應用程序發送“compensationValue”用戶信息時, CompactSlider不會更新。

就像一旦@Published var sliderValue = 0.0CompactSlider編寫,當由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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM