Как запустить метод в ContentView, когда ObservedObject изменяется в другом классе [Swift 5 iOS 13.4] - PullRequest
0 голосов
/ 09 апреля 2020

Вот моя основа c ContentView

struct ContentView: View
{
    @ObservedObject var model = Model()

    init(model: Model)
    {
        self.model = model
    }

    // How to observe model.networkInfo's value over here and run "runThis()" whenever the value changes?

    func runThis()
    {
        // Function that I want to run
    }

    var body: some View
    {
        VStack
            {
            // Some widgets here
            }
        }
    }
}

Вот моя модель

class Model: ObservableObject
{
    @Published var networkInfo: String
    {
        didSet
            {
                // How to access ContentView and run "runThis" method from there?
            }
    }
}

Я не уверен, что она доступна? Или если я могу наблюдать изменения ObservableObject из View и запускать какие-либо методы?

Заранее спасибо!

1 Ответ

0 голосов
/ 09 апреля 2020

Есть несколько способов сделать это. Если вы хотите запуститьThis () при изменении networkInfo, вы можете использовать что-то вроде этого:

class Model: ObservableObject {
    @Published var networkInfo: String = "" 
}


struct ContentView: View {
@ObservedObject var model = Model()

var body: some View {
    VStack {
        Button(action: {
            self.model.networkInfo = "test"
        }) {
            Text("change networkInfo")
        }
    }.onReceive(model.$networkInfo) { _ in self.runThis() }
   }

func runThis() {
      print("-------> runThis")
 }
 } 

другой глобальный способ это:

 class Model: ObservableObject {
   @Published var networkInfo: String = "" {
    didSet {
        NotificationCenter.default.post(name: NSNotification.Name("runThis"), object: nil)
    }
}
}

 struct ContentView: View {
@ObservedObject var model = Model()

var body: some View {
    VStack {
        Button(action: {
            self.model.networkInfo = "test"
        }) {
            Text("change networkInfo")
        }
    }.onReceive(
    NotificationCenter.default.publisher(for: NSNotification.Name("runThis"))) { _ in
        self.runThis()
    }
   }

func runThis() {
      print("-------> runThis")
 }
 }
...