#ios #swift #swiftui #observableobject #observedobject
#iOS #swift #swiftui #observableobject #observedobject
Вопрос:
Это простой пример для моего случая. У меня есть ViewModel @ObservedObject (Object1), передайте свойство (Object2) в другое представление (View2). Измените значение в представлении 2, и когда я вернусь к представлению 1, я бы хотел, чтобы значение тоже обновлялось. Каково наилучшее решение?
В этом примере, когда я нажимаю синее число, я бы хотел, чтобы черное число также обновлялось. На самом деле я не знаю, почему черный номер обновляется после нажатия кнопки «Показать». Я был бы очень признателен, если бы вы могли мне помочь. Спасибо.
import SwiftUI
import Combine
struct ContentView: View {
@ObservedObject var object1: Object1 = Object1(ob: Object2(n: 0))
@State var isShow = false
var body: some View {
NavigationView {
VStack {
Text("(object1.object2.n)")
//NavigationLink(destination: View2(object2: object1.object2)) {
// Text("Go to view 2")
//}
View2(object2: object1.object2)
Button {
isShow = true
} label: {
Text("Show")
}.alert(isPresented: $isShow, content: {
Alert(title: Text("(object1.object2.n)"))
})
}
}
}
}
struct View2: View {
@ObservedObject var object2: Object2
var body: some View {
Button {
object2.n = 1
} label: {
Text("(object2.n)")
}
}
}
class Object1: ObservableObject {
@Published var object2: Object2
init(ob: Object2) {
self.object2 = ob
}
}
class Object2: ObservableObject {
@Published var n: Int = 0
init(n: Int) {
self.n = n
}
}
Ответ №1:
Вот возможное решение:
var body: some View {
NavigationView {
VStack {
Text("(object1.object2.n)")
.onChange(of: object1.object2.n) { _ in
object1.objectWillChange.send()
}
// .. other code
Альтернативным вариантом является перемещение каждой object2
зависимой части в отдельный subview, наблюдаемый object2
явно.
Комментарии:
1. Я только что попробовал в Xcode 12.1 и iOS 14.1, по-прежнему ничего не изменилось. Я нахожу решение для iOS 13. Большое вам спасибо.