chudin26
chudin26

Reputation: 1172

How to access to SwiftUI content view in extension delegate on Apple Watch?

I need to call loadData in my ContentView when the app becomes active. ExtensionDelegate is a class which handle app events such as applicationDidBecomeActive. But I don't understand how to get ContentView inside ExtensionDelegate.

This is my ContentView:

struct ContentView: View {

    let network = Network()

    @State private var currentIndex: Int = 0
    @State private var sources: [Source] = []

    var body: some View {
        ZStack {
            // Some view depends on 'sources'
        }
        .onAppear(perform: loadData)
    }

    func loadData() {
        network.getSources { response in
            switch response {
            case .result(let result):
                self.sources = result.results

            case .error(let error):
                print(error)
            }
        }
    }

}

And ExtensionDelegate:

class ExtensionDelegate: NSObject, WKExtensionDelegate {

    func applicationDidFinishLaunching() {

    }

    func applicationDidBecomeActive() {
        // Here I need to call 'loadData' of my ContentView
    }

    func applicationWillResignActive() {
    }
...

Upvotes: 3

Views: 965

Answers (1)

Asperi
Asperi

Reputation: 257543

The simplest solution as I see would be to use notification

in ContentView

let needsReloadNotification = NotificationCenter.default.publisher(for: .needsNetworkReload)

var body: some View {
    ZStack {
        // Some view depends on 'sources'
    }
    .onAppear(perform: loadData)
    .onReceive(needsReloadNotification) { _ in self.loadData()}
}

and in ExtensionDelegate

func applicationDidBecomeActive() {
    NotificationCenter.default.post(name: .needsNetworkReload, object: nil)
}

and somewhere in shared

extension Notification.Name {
    static let needsNetworkReload = Notification.Name("NeedsReload")
}

Upvotes: 6

Related Questions