SwiftUI’s view modifier onDisappear
is useful for running code when a view goes away. The issue is that it doesn’t differentiate between the view being unloaded and it simply being covered or hidden. Sometimes you want to run specific code when the view is dismissed or unloaded. Simply putting that code in an onDisappear
will cause it to run any time a new view is pushed or the tab is changed.
The simple solution to this is to check the view’s presentationMode
environment variable.
@Environment(\.presentationMode) var presentationMode
This property is a binding to a PresentationMode
object. We can check its isPresented
value in onDisappear
to determine if the view is loaded or not. If isPresented
is true, that means the view is still loaded, it just was just hidden. If isPresented
is false, that means the view unloaded.
.onDisappear {
if presentationMode.wrappedValue.isPresented {
print("View was hidden")
} else {
print("View unloaded")
}
}
That’s it! Code in the “View was hidden” block will run any time a view is pushed or the tab of a TabView
is changed. Code in the “View unloaded” should only run when the view is dismissed or unloaded.