## iOS 15+
**(Done button above the keyboard)**
Starting with iOS 15 we can now use [`@FocusState`](
[To see links please register here]
) to control which field should be focused (see [this answer](
[To see links please register here]
) to see more examples).
We can also add `ToolbarItem`s directly above the keyboard.
When combined together, we can add a `Done` button right above the keyboard. Here is a simple demo:
[![enter image description here][1]][1]
```
struct ContentView: View {
private enum Field: Int, CaseIterable {
case username, password
}
@State private var username: String = ""
@State private var password: String = ""
@FocusState private var focusedField: Field?
var body: some View {
NavigationView {
Form {
TextField("Username", text: $username)
.focused($focusedField, equals: .username)
SecureField("Password", text: $password)
.focused($focusedField, equals: .password)
}
.toolbar {
ToolbarItem(placement: .keyboard) {
Button("Done") {
focusedField = nil
}
}
}
}
}
}
```
## iOS 14+
**(Tap anywhere to hide the keyboard)**
Here is an updated solution for **SwiftUI 2 / iOS 14** (originally proposed [here](
[To see links please register here]
) by Mikhail).
It doesn't use the `AppDelegate` nor the `SceneDelegate` which are missing if you use the SwiftUI lifecycle:
```
@main
struct TestApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onAppear(perform: UIApplication.shared.addTapGestureRecognizer)
}
}
}
extension UIApplication {
func addTapGestureRecognizer() {
guard let window = windows.first else { return }
let tapGesture = UITapGestureRecognizer(target: window, action: #selector(UIView.endEditing))
tapGesture.requiresExclusiveTouchType = false
tapGesture.cancelsTouchesInView = false
tapGesture.delegate = self
window.addGestureRecognizer(tapGesture)
}
}
extension UIApplication: UIGestureRecognizerDelegate {
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true // set to `false` if you don't want to detect tap during other gestures
}
}
```
---
If you want to detect other gestures (not only *tap* gestures) you can use `AnyGestureRecognizer` as in Mikhail's [answer](
[To see links please register here]
):
```
let tapGesture = AnyGestureRecognizer(target: window, action: #selector(UIView.endEditing))
```
---
Here is an example how to detect simultaneous gestures except Long Press gestures:
```
extension UIApplication: UIGestureRecognizerDelegate {
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return !otherGestureRecognizer.isKind(of: UILongPressGestureRecognizer.self)
}
}
```
[1]: