class 的 属性 更改时,swiftui 文本视图不会更新

swiftui text view does not update when the property of class changes

发现了大量类似的问题,但它们都有不同的条件 - none 其中似乎适用于我的情况。

Text() 视图不会使用 class 的 属性 进行更新,但布什按钮会打印正确的值。片段中有更多信息。

观点:

import SwiftUI

struct ContentView: View {
   @State private var client : Client = Client()

   var body: some View {
      VStack{
         Text(client.message)             // This view remains constant

         ...

         Button( action: {
             print("\(client.message)")  // Prints correct updated value
         }){
             Text("Mess")
         }
      }
   }
}

Class:

class Client : ObservableObject{
   private var mqtt: CocoaMQTT!
   @Published var message : String = "Empty"

   ...

   func get_message(mess : String){
      self.message = mess
      self.objectWillChange.send()
   }
}

甚至objectWillChange.send() 似乎也不会触发视图的更改。有什么想法吗?

对于对象使用@StateObject 属性 包装器,对于字符串、Int 等使用@State 属性 包装器。

@State:当我们观察到存在于我们的 ContentView 中的 属性 时,我们使用这个 属性 包装器。

@StateObject:当我们观察存在于我们的 ContentView 之外的属性时,例如在我们的对象中,我们使用这个 属性 包装器,我们可以通过首先符合 [=17] 来观察 属性 变化=] 到 ObservableObject 协议并将 属性 标记为 @Published 在我们的对象中。

struct ContentView: View {
   @StateObject private var client : Client = Client()

   var body: some View {
      VStack{
         Text(client.message)             

         Button( action: {
             print("\(client.message)")  
         }){
             Text("Mess")
         }
      }
   }
}

class Client : ObservableObject{
   private var mqtt: CocoaMQTT!
   @Published var message : String = "Empty"

   func get_message(mess : String){
      self.message = mess
   }
}