In SwiftUI, you can hide the keyboard by resigning the first responder status of the current text field. There are a few ways to accomplish this:
1.Using UIApplication.shared.sendAction(_:to:from:for:)
: You can use the UIApplication
method sendAction(_:to:from:for:)
to send the resignFirstResponder
action to the current responder. Here’s how you can use it:
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
This line of code will hide the keyboard regardless of the currently focused text field.
2.Using endEditing(_:)
on UIView
: You can extend View
to provide a function that ends editing on the UIView
. Here’s an example:
extension View {
func endEditing(_ force: Bool) {
UIApplication.shared.windows.forEach { $0.endEditing(force) }
}
}
You can then call endEditing(_:)
on any view to hide the keyboard:
struct ContentView: View {
@State private var text: String = ""
var body: some View {
TextField("Enter text", text: $text)
.padding()
.onTapGesture {
self.endEditing(true)
}
}
}
In this example, tapping anywhere on the view will hide the keyboard.
3.Using onTapGesture
with a Clear Overlay: You can overlay the entire screen with an invisible view that detects taps and hides the keyboard. Here’s an example:
struct ContentView: View {
@State private var text: String = ""
var body: some View {
ZStack {
TextField("Enter text", text: $text)
.padding()
Color.clear
.onTapGesture {
self.endEditing(true)
}
}
}
}
In this example, tapping anywhere on the screen outside the text field will hide the keyboard.
4.Hide Keyboard When Tapped Outside the TextField
: To close the keyboard when the user taps outside the TextField
, you can create a full-screen white view with a tap action. This action will trigger the endEditing()
function:
struct Background<Content: View>: View {
private var content: Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content()
}
var body: some View {
Color.white
.frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
.overlay(content)
}
}
struct ContentView: View {
@State private var name: String = ""
var body: some View {
Background {
VStack {
Text("Hello \(self.name)")
TextField("Name...", text: self.$name) {
self.endEditing()
}
}
}
.onTapGesture {
self.endEditing()
}
}
private func endEditing() {
UIApplication.shared.endEditing()
}
}