In my Watch app, the WatchDelegate class is the WCSession delegate and handles transferring data with the iOS app.
When the delegate receives some data it stores it in the UserDefaults.
When the Watch app is launched it reads the existing data stored in the defaults and creates the view.
I have a WatchApp file which contains this:
@main
struct WatchApp: App {
var body: some Scene {
WindowGroup {
if(getItems().count == 0) {
NoEventsView()
} else {
ItemsListView(available: getItems())
}
}
}
}
As you can see, if there are no events in the defaults it shows the NoEventsView; and if there are some it shows the EventsListView.
When the Watch delegate receives a change in the events, I need to refresh this view. The delegate can receive zero or more events.
How on Earth do I do that?
In iOS I could call a method to reload a table of data, or post a notification to another view controller to do that, but in the Watch and with SwiftUI there doesn't seem to be any obvious way of refreshing a view.
Is there any way of telling the App struct to refresh, or a particular view? For example, if I extracted the if statement into its own "struct WhichView: View", could I tell that to refresh?
I've read a LOT on the net these past few days on @State vars, @ObservedObject, @Published etc, but nothing I've seen works, or is far too weird and complex for my situation.
I literally just want WatchApp or WhichView to redraw when I tell it to. How do I do that?
Thanks.
4
1
2.5k