Search code examples
swiftswiftui

How to detect if keyboard is present in swiftui


I want to know if the keyboard is present when the button is pressed. How would I do this? I have tried but I don't have any luck. Thanks.


Solution

  • Using this protocol, KeyboardReadable, you can conform to any View and get keyboard updates from it.

    KeyboardReadable protocol:

    import Combine
    import UIKit
    
    
    /// Publisher to read keyboard changes.
    protocol KeyboardReadable {
        var keyboardPublisher: AnyPublisher<Bool, Never> { get }
    }
    
    extension KeyboardReadable {
        var keyboardPublisher: AnyPublisher<Bool, Never> {
            Publishers.Merge(
                NotificationCenter.default
                    .publisher(for: UIResponder.keyboardWillShowNotification)
                    .map { _ in true },
                
                NotificationCenter.default
                    .publisher(for: UIResponder.keyboardWillHideNotification)
                    .map { _ in false }
            )
            .eraseToAnyPublisher()
        }
    }
    

    It works by using Combine and creating a publisher so we can receive the keyboard notifications.

    With an example view of how it can be applied:

    struct ContentView: View, KeyboardReadable {
        
        @State private var text: String = ""
        @State private var isKeyboardVisible = false
        
        var body: some View {
            TextField("Text", text: $text)
                .onReceive(keyboardPublisher) { newIsKeyboardVisible in
                    print("Is keyboard visible? ", newIsKeyboardVisible)
                    isKeyboardVisible = newIsKeyboardVisible
                }
        }
    }
    

    You can now read from the isKeyboardVisible variable to know if the keyboard is visible.

    When the TextField is active with the keyboard showing, the following prints:

    Is keyboard visible? true

    When the keyboard is then hidden upon hitting return, the following prints instead:

    Is keyboard visible? false

    You can use keyboardWillShowNotification/keyboardWillHideNotification to update as soon as they keyboard starts to appear or disappear, and the keyboardDidShowNotification/keyboardDidHideNotification variants to update after the keyboard has appeared or disappeared. I prefer the will variant because the updates are instant for when the keyboard shows.