ios - 为什么在函数中使用已发布变量的更新值没有得到反映?
问题描述
我正在尝试按照本教程将 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)
}
}
解决方案
@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")
})
}
}
推荐阅读
- asp.net - MVC登录密码比较区分大小写
- html - :focus-withing 不适用于悬停效果
- sql - Oracle 作业调度程序在每天一个特定时间执行,对该作业任务进行两次查询
- javascript - 如何在 Chrome 中加载下一页之前断开 websocket
- java - 使用 MediaStore.ACTION_IMAGE_CAPTURE 要求用户按 OK 或 RETRY
- r - 如何从 R 中的 for 循环返回绘图?
- acumatica - 复制到变量
- php - laravel 5.6 在资源响应中保留数组自定义键
- shell - 我可以在目录中删除 shell 中的文件,但是我从目录外部收到 File not found 错误
- java - 列计数与第 1 行 java 的值计数不匹配