[SWIFT 3] Comment connaitre la vue courante dans AppDelegate ?
Bonjour,
J'ai un petit soucis sur comment savoir sur quelle vue je me trouve dans AppDelegate..
En gros, je reçois des notifications push silencieuse, si je suis sur tel ou tel interface, mon action est différente..
Par contre, je n'arrive pas à savoir sur quelle vue je suis quand je reçois la notification..
Comment-vous vous y prenez pour savoir sur quelle view l'utilisateur est (dans AppDelegate) ?
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Là comme ça, sans réfléchir, j'utiliserais le tag de chaque vue pour l'identifier.
T'as un petit exemple rapide sous la main ? ^^
J't'avoue que j'utilise jamais les tag des vues..
// Edit
En fait, j'viens de me débrouiller autrement, il reste un petit soucis, je corriger et je post ma solution après, si ça peut en aider certains ^^
self.windows.rootViewController devrait fonctionner (codé sans tester).
Après, en fonction de l'architecture, rootViewController peut être un UINavigationController, UITabBarController, etc. et ils doivent avoir un truc comme presentedViewController, etc.
Maintenant, tu peux poster toi-même un NSNotification au sein de ton application, et même avec différents noms en fonction des push notifications, et chaque ViewController peut écouter des NSNotification et agir en fonction.
Alors voilà où j'en suis :
Dans AppDelegate, j'ai rajouté :
et je l'utilise comme ça :
Du coup, ça fonctionne bien..
Maintenant, deuxième soucis, comment déclencher une fonction quand je suis dans un cas qui m'intéresse ?
Par exemple, dans DiscussionsCollectionViewController, j'ai une fonction chargeDiscussion..
Je pensais juste faire :
Mais ça ne fonctionne pas.. une idée ?
Euh, j'suis pas fort en Swift, mais tu fais un alloc/init d'un nouveau DiscussionsCollectionViewController et tu appelles chargeDiscussion(), non ?
Pourquoi ne pas faire (topController as DiscussionsCollectionViewController).chargeDiscussion()
Parce que mon cerveau embrouillé ne trouvait plus la syntaxe.. mais maintenant que j'le vois écrit, c'était tout con et logique ^^
ça fonctionne nickel, merci ^^
Je demanderais, pourquoi ? Surtout dans l'AppDelegate ???
C'est dans appDelegate que je gère la réception de mes notifications silencieuses..
Si j'en reçois une de type "Message", je veux faire une action différente suivant là où je me trouve..
Par exemple :
- Je suis sur la liste des conversation : je refresh la liste
- Je suis dans la bonne conversation : je refresh la conversation
- Je suis ailleurs : j'envois une notification locale pour avertir qu'il y a un nouveau message
etc, etc ^^
Bah non. Tu devrais recevoir les notifications dans l'AppDelegate mais, de là , tu pourrais utiliser NotificationCenter.default pour poster tes propres notifications, que tu puisses recevoir dans les ViewControllers.
Je pense à une solution comme celle de Larme :
Comme ça tu peux la caster avec as? UINavigationController (si ça correspond à ton type de navigation) et si besoin :
Pour récupérer la viewController
C'est pas nécessaire de toucher les ViewControllers depuis l'AppDelegate. ça confond le logique de l'UI avec la logique de l'appli.
Les notifications locaux, envoyées aux ViewControllers marchent très bien et résolvent le problème sans besoin de fouiller parmi tous les fenêtres ou ViewControllers.
Il y a au moins un cas où c'est nécessaire: quand c'est l'AppDelegate qui instancie le Modèle. Il doit connaà®tre le premier ViewController pour pouvoir lui passer le Modèle. Certes, tout le monde ne passe pas le modèle, mais ce que je dis est clairement décrit dans le guide des Storyboards.
Tu as raison. Mais, pour ce que Insou voulait, c'est pas conseillé
J'ai trouvé ceci :
https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/TheAppLifeCycle/TheAppLifeCycle.html#//apple_ref/doc/uid/TP40007072-CH2-SW2
Qui indique qu'il y a une connexion entre l'AppDelegate et le Model.