#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
.