Как я могу заставить функцию структуры, которая обновляет переменную в другом представлении, также обновлять это представление при изменении?

#swift #swiftui

#swift #swiftui

Вопрос:

 import SwiftUI
import Combine

struct ContentView: View {
    
    var subtract = MinusToObject()
    
    
    var body: some View {
        VStack{
            
            Text("The number is (MyObservedObject.shared.theObservedObjectToPass)")
            Text("Minus")
                .onTapGesture {
                    subtract.subtractIt()
                }
            
            NavigationView {
                NavigationLink(destination: AnotherView()) {
                    Text("Push")
                }.navigationBarTitle(Text("Master"))
            }

            
        }
    }
}

class MyObservedObject: ObservableObject {
    static let shared = MyObservedObject()
    private init() { }
    
    @Published var theObservedObjectToPass = 6
}

struct MinusToObject {
    func subtractIt() {
        MyObservedObject.shared.theObservedObjectToPass -= 1
    }
}
  

Когда я нажимаю Minus на вызов функции моего subtract экземпляра, я знаю, что значение изменяется, потому что, если я перейду к другому представлению, я смогу увидеть новое значение, но текущее представление не обновляется.

Я думаю, что мне нужно поместить оболочку свойств вокруг var subtract = MinusToObject() (я пробовал несколько довольно слепо), и я чувствую, что должен поместить $ где-нибудь для двусторонней привязки, но я не могу понять, где именно.

Ответ №1:

MinusToObject Является избыточным. Вот способ (если хотите, сохранить общий доступ к MyObservedObject)…

 struct ContentView: View {
    
    @ObservedObject private var vm = MyObservedObject.shared
    //@StateObject private var vm = MyObservedObject.shared     // << SwiftUI 2.0
    
    
    var body: some View {
        VStack{
            
            Text("The number is (vm.theObservedObjectToPass)")
            Text("Minus")
                .onTapGesture {
                    self.vm.theObservedObjectToPass -= 1
                }
            
            NavigationView {
                NavigationLink(destination: AnotherView()) {
                    Text("Push")
                }.navigationBarTitle(Text("Master"))
            }
            
        }
    }
}
  

Комментарии:

1. Хотя это работает, я просто использую это в качестве примера, чтобы выяснить, как использовать метод экземпляра второй структуры в представлении, которое обновляет представление. Может быть, это тот случай, когда этого никогда не следует делать?