Swiftui @EnvironmentObject 在视图中更新

Posted

技术标签:

【中文标题】Swiftui @EnvironmentObject 在视图中更新【英文标题】:Swiftui @EnvironmentObject update in View 【发布时间】:2020-08-27 22:50:08 【问题描述】:

我正在使用 @EnvironmentObject(即 ViewModel)并且我有一个 demoData() 函数。

当我按下它时,数据确实发生了变化,但我的视图没有更新。

如何让数据在视图中改变?

谢谢。

查看信息:

import Combine
import SwiftUI

struct MainView: View 
 
    @EnvironmentObject var entry:EntryViewModel

     var body: some View 

         TextField("Beg Value", text: self.$entry.data.beg)
         TextField("Beg Value", text: self.$entry.data.end)

         Button(action:  self.entry.demoData() )  Text("Demo Data") 

    

视图模型:

class EntryViewModel: ObservableObject 
 
    @Published  var data:EntryData = EntryData()

    func demoData() 
     
        var x = Int.random(in: 100000..<120000)
        x = Int((Double(x)/100).rounded()*100)
        data.beg = x.withCommas()
    
        x = Int.random(in: 100000..<120000)
       x = Int((Double(x)/100).rounded()*100)
       data.end = x.withCommas()
    

型号:

 EntryData:ObservableObject 

    @Published var beg:String = ""
    @Published var end:String = ""


【问题讨论】:

【参考方案1】:

这是因为EntryData 是一个类,如果您更改它的属性,它仍然是同一个对象。

这个@Published 只会在您重新分配data 属性时触发:

@Published var data: EntryData = EntryData()

一种可能的解决方案是使用简单的 struct 而不是 ObservableObject class

struct EntryData 
    var beg: String = ""
    var end: String = ""

当一个结构被改变时,它被复制,因此@Published 将发送objectWillChange

【讨论】:

以上是关于Swiftui @EnvironmentObject 在视图中更新的主要内容,如果未能解决你的问题,请参考以下文章

ObjectBinding 和 EnvironmentObject 有啥区别?

SwiftUI - SwiftUI 中是不是有等效的 popViewController?

swiftui 请求 渲染数据

SwiftUI 学习曲线

SwiftUI NavigationLink 如何到达另一个 SwiftUI 页面?

SwiftUI - 如何在 SwiftUI 中弹出到特定视图?