Saya memiliki tampilan SwiftUI yang menggunakan EnvironmentObject yang dipanggil appModel
. Kemudian membaca nilai appModel.submodel.count
dalam body
metodenya. Saya berharap ini untuk mengikat pandangan saya ke properti count
di submodel
sehingga membuat kembali ketika properti diperbarui, tetapi ini tampaknya tidak terjadi.
Apakah ini bug? Dan jika tidak, apa cara idiomatis untuk memiliki pandangan mengikat properti bersarang objek lingkungan di SwiftUI?
Secara khusus, model saya terlihat seperti ini ...
class Submodel: ObservableObject {
@Published var count = 0
}
class AppModel: ObservableObject {
@Published var submodel: Submodel = Submodel()
}
Dan pandangan saya terlihat seperti ini ...
struct ContentView: View {
@EnvironmentObject var appModel: AppModel
var body: some View {
Text("Count: \(appModel.submodel.count)")
.onTapGesture {
self.appModel.submodel.count += 1
}
}
}
Ketika saya menjalankan aplikasi dan mengklik label, count
properti bertambah tetapi label tidak memperbarui.
Saya dapat memperbaikinya dengan melewatinya appModel.submodel
sebagai properti ContentView
, tetapi saya ingin menghindari melakukannya jika memungkinkan.
Jawaban:
Model bersarang belum berfungsi di SwiftUI, tetapi Anda dapat melakukan sesuatu seperti ini
Pada dasarnya milikmu
AppModel
menangkap acara dariSubmodel
dan mengirimkannya lebih jauh ke ViewEdit:
Jika Anda tidak perlu
SubModel
menjadi kelas, maka Anda dapat mencoba sesuatu seperti ini:sumber
Submodel
menjadiObservableObject
jenis?Ketiga ViewModels dapat berkomunikasi dan memperbarui
Terima kasih Sorin untuk solusi Combine.
sumber
Sepertinya bug. Ketika saya memperbarui xcode ke versi terbaru, itu berfungsi dengan benar saat mengikat ke ObservableObjects bersarang
sumber