Обновление Swiftui @EnvironmentObject в представлении

#swiftui

#swiftui

Вопрос:

Я использую @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") }

    }
}
  

ViewModel:

 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()
  

Возможным решением является использование простой структуры вместо класса ObservableObject:

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

Когда структура изменяется, она копируется и, следовательно, @Published отправит objectWillChange .