【问题标题】:Why is the published variable's updated value not getting reflected when used in function?为什么在函数中使用已发布变量的更新值没有得到反映?
【发布时间】:2021-03-28 17:31:54
【问题描述】:

我正在尝试关注tutorial 以将 WatchConnectivity 与 SwiftUI 一起使用。在手表的视图模型中,我能够成功接收从 iPhone 发送的消息并将其设置在类的发布变量中,但是当我尝试在 ContentView 中使用该值时,我只看到初始值而不是更新后的值。

ViewModelWatch

import Foundation
import WatchConnectivity

class ViewModelWatch : NSObject,  WCSessionDelegate, ObservableObject{
    var session: WCSession
    @Published var sessionId = ""
    
    init(session: WCSession = .default){
        self.session = session
        super.init()
        self.session.delegate = self
        session.activate()
    }
    
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        
    }
    
    func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
            DispatchQueue.main.async {
                if let sessionId = message["sessionId"] {
                    self.sessionId = sessionId as! String
                }
            }
        }
}

内容视图

import SwiftUI

struct ContentView: View {
    @ObservedObject var model = ViewModelWatch()
    
    var body: some View {
        Button(action: startAction, label: {
          Text("Test")
        })
      
       
    }
    
    func startAction() {
        print("sessionId", self.model.sessionId)

    }
}

【问题讨论】:

  • View 观察自己的 observable 属性是否依赖于它们,但它不知道(实际上也不知道)任何闭包(包括函数)内部发生了什么
  • @Asperi - 那么你建议如何获取更新后的 sessionId 值?

标签: ios swift swiftui watchos watchconnectivity


【解决方案1】:

@Asperi - 那么你会如何建议获取更新后的 sessionId 值?

一种解决方案是将动作移动到模型中,因此它使用自己的属性进行操作,并直接在按钮(或按钮动作闭包)中使用该动作,例如

class ViewModelWatch : NSObject,  WCSessionDelegate, ObservableObject{

    // ... other code

    func startAction() {                     // << move here
        print("sessionId", self.sessionId)

    }
}

struct ContentView: View {
    @ObservedObject var model = ViewModelWatch()

    var body: some View {
        Button(action: model.startAction, label: {     // << use model
          Text("Test")
        })
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2023-02-10
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多