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
}
}
发现了大量类似的问题,但它们都有不同的条件 - 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
}
}