J'ai essayé d'apprendre le modèle de coordinateur en créant une nouvelle application sur Xcode 11.2 en utilisant les storyboards comme conception d'interface.
J'ai suivi cette vidéo de Paul Hudson mais je suis resté bloqué à la minute 12 lorsque le code devait être ajouté au fichier AppDelegate.swift. Comme c'est le cas, l'application se lancera, le premier contrôleur de vue s'affichera mais il ne naviguera pas.
Que dois-je changer ou, mieux, où dois-je déplacer le code actuel pour le faire fonctionner ?
L'ensemble du projet peut être trouvé ici.
En bref, le code qui dans iOS 12 et avant était dans AppDelegate est le suivant :

var coordinator: MainCoordinator?
var window: UIWindow?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    let navController = UINavigationController()
    coordinator = MainCoordinator(navigationController: navController)
    coordinator?.start()

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.rootViewController = navController
    window?.makeKeyAndVisible()

    return true
}

J'ai vu que maintenant window est dans SceneDelegate mais déplacer tout là-bas vers la méthode sceneDidConnect n'aide pas. Quelqu'un peut-il m'éclairer ici ?

Merci!

3
NotationMaster 20 nov. 2019 à 11:08

1 réponse

Meilleure réponse

Quelques modifications doivent donc être apportées pour pouvoir implémenter ce modèle. Tout d'abord, vous devez restaurer votre AppDelegate à son format initial lors de la création :

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

Vous pouvez supprimer la déclaration var coordinator: MainCoordinator? en haut.

Dans SceneDelegate, remplacez le code de la fonction sceneWillConnectToSession par ce qui suit :

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 
    guard let windowScene = (scene as? UIWindowScene) else { return }
    let navController = UINavigationController()
    let coordinator = MainCoordinator(navigationController: navController)
    coordinator.start()

    let window = UIWindow(windowScene: windowScene)
    window.rootViewController = navController
    self.window = window
    window.makeKeyAndVisible()
}

Le dernier changement est que j'ai supprimé la déclaration faible pour MainCoordinator dans vos contrôleurs de vue.

Je l'ai donc simplement remplacé par var coordinator: MainCoordinator?, puis cela a fonctionné.

Article de référence : Le délégué de scène dans Xcode 11 et iOS 13

7
Alan S 29 janv. 2020 à 08:41