He creado un nuevo proyecto usando Xcode 11. Estoy acostumbrado a crear el controlador de vista raíz de mi UIWindow mediante programación y noté por primera vez este nuevo archivo SceneDelegate. Después de investigar un poco, encontré un artículo que describe cómo crear un controlador de vista raíz usando esta nueva API UIScene y parece funcionar correctamente. Sin embargo, no pude encontrar una manera de hacer lo mismo para las versiones inferiores de iOS porque la clase AppDelegate ahora ya no tiene una propiedad window. Entonces, mi pregunta es ¿cómo creo un controlador de vista raíz mediante programación para otras versiones de iOS?

0
Alex Chekel 5 oct. 2019 a las 12:55

1 respuesta

La mejor respuesta

Aquí está el código si alguien se enfrenta a lo mismo.

Flujo de trabajo de iOS 13

Código tomado de este artículo.

En su archivo SceneDelegate:

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let windowScene = (scene as? UIWindowScene) else { return }
        self.window = UIWindow(frame: windowScene.coordinateSpace.bounds)
        self.window?.windowScene = windowScene

        let controller = UIViewController()
        let navigationController = UINavigationController(rootViewController: controller)

        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()
    }


IOS 12 y versiones anteriores

En su archivo AppDelegate:

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        if #available(iOS 13.0, *) { return true }

        self.window = UIWindow(frame: UIScreen.main.bounds)

        let controller = UIViewController()
        let navigationController = UINavigationController(rootViewController: controller)

        self.window?.rootViewController = navigationController
        self.window?.makeKeyAndVisible()

        return true
    }                         


Es importante mantener UIWindow en una variable para que se muestre.

1
Alexandr Chekel 11 dic. 2019 a las 11:51