Search code examples
swiftuitextfielduiscenedelegateios15

Could not find keyboard scene delegate for interaction view


Below iOS 13 my UITextField correctly launches a keyboard and lets the user type in their answer.

Above iOS 13, textFieldDidBeginEditing() is triggered when I tap on the text field, but the keyboard is not shown, so the user cannot give their answer .

Debug console doesn't immediately throw any errors, but eventually the following message comes up, which I think is the key:

Could not find keyboard scene delegate for interaction view

I think the error appears in the later iOSs because scenes become the main thing - and somewhere I needed to set up a delegate to allow the keyboard to appear over the fron of the first scene.

No idea how to do this though!

My UITextField is totally standard. To reproduce the error, I have the following set up code in my SceneDelegate

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        let windowScene = UIWindowScene(session: session, connectionOptions: connectionOptions)
        self.window = UIWindow(windowScene: windowScene)
        
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        
        let initialViewController = storyboard.instantiateViewController(withIdentifier: "VC" )
        self.window?.rootViewController = initialViewController
        self.window?.makeKeyAndVisible()
        
        guard let _ = (scene as? UIWindowScene) else { return }
    }

In my actual app - I use this subroutine to launch a tutorial if the user is new (i.e. I need to be able to change the starting view controller)


Solution

  • Something appears to be out of sorts in your SceneDelegate function scene().

    Try this code which I grabbed from another project I have at hand.

        func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
            guard let windowScene = (scene as? UIWindowScene) else { return }
    
            window = UIWindow(frame: windowScene.coordinateSpace.bounds)
            window?.windowScene = windowScene
            self.window?.rootViewController = ViewController()
            self.window?.makeKeyAndVisible()
        }