How to dismiss SwiftUI modal view
Download materialsVery often we present a SwiftUI view modally using sheet
modifier, or by pushing it onto the navigation stack. In order to dismiss it, you can use presentationMode
environment value:
struct SettingsScreen: View {
@Environment(\.presentationMode) var presentationMode
var body: some View {
NavigationView {
Text("Hello, World!")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Dismiss") {
presentationMode.wrappedValue.dismiss()
}
}
}
}
}
}
The benefit of this approach is that it works both for navigation stacks and for modal sheets. It also works when we present SwiftUI view embedded into a UIHostingController
from UIKit context.
The environment value presentationMode
works from iOS 12.0, but since iOS 15.0 we have a new, direct API to dismiss views which is dismiss
environment value:
@available(iOS 15.0, *)
struct SettingsScreen: View {
@Environment(\.dismiss) var dismiss
var body: some View {
NavigationView {
Text("Hello, World!")
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Dismiss") {
dismiss()
}
}
}
}
}
}
Conclusion
Dismissing views in SwiftUI
is very simple thanks to the environment values presentationMode
and dismiss
. I hope you found this article helpful. If you have any questions, suggestions, or feedback, please let me know on Twitter.
You can download a sample project with the implementation via the link at the top of the page.
Thanks for reading!