Как обновить parentView после обновления SubView @ObservedObject SwiftUI

#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. Большое вам спасибо.