J'ai un uitabbarcontroller comme contrôleur de vue racine et j'ai besoin d'accéder à une propriété dans ProfileViewController.
Voici le storyboard: p>
3 Réponses :
Un moyen de sale plus facile à trouver le contrôleur d'affichage du désir:
let profile = (rootVC as? UITabBarController)?.viewControllers? .first { $0 is ProfileViewController } .map { $0 as! ProfileViewController } // this unwrap is safe since we filtered by first profile?.doSomething()
oauthservice code> responsable de l'authentification, des jetons et de l'oauth, etc. li>
- Appdelegate a une référence forte sur
oauthservice code>, car probablement la crée dans ApplicationDidfinishLaunching (_) code>. li>
-
oauthservice code> fournit des flux de délégués / notification / état pour informer sur les modifications de l'état de la session Li>
-
ProfileViewConCtOLLER CODE> Abonné à cette modification LI>
ul> p>
Je recommanderais d'accéder au contrôleur d'affichage du délégué de l'application. Il met trop de connaissance de ce que le contrôleur d'affichage a besoin (et sa structure) dans le délégué de l'application. C'est un design fragile. P>
Une meilleure approche serait de définir votre propre notification Ajouter du code dans le contrôleur d'affichage approprié pour écouter cette notification personnalisée. Lorsque la notification est reçue dans le contrôleur d'affichage, obtenez l'URL et agissez en conséquence. P>
Cette approche met la connaissance de qui se soucie de la notification et de la manière de gérer la notification à laquelle elle appartient. Il permet également à plus d'un contrôleur d'affichage (ou d'autres classes) d'agir sur la même notification sans ajouter de plus en plus logique dans le délégué de l'application. p> notification code>. Publier cette notification de l'application déléguée avec la charge utile nécessaire (l'URL). P>
Dans mon profileViewController j'ai ajouté notificationcenter.default.addobserver.default.addobserver.default.addobserver (auto, sélecteur: #Selector (Self.Handderedirect (Notification :)), Nom: NSNOTIFICATION.NAME (RAWVALUE: OAuth2appDidreceIVecallBackNotification), Objet: NIL) CODE> ET
@OBJC Func Handlerdirect (Notification: NSnotification) {OAuth2.HandderDirecturl (notification.Object as! URL)} code> Ainsi dans Appdelegate Just
NotificationCenter.default.post (Nom: NSNOTIFICATION.NAME (RAWVALUE: Oauth2appdidreceivecallAnnotification), objet: URL) code>
La bonne approche doit être d'avoir une "DataSource" / "dbmanager" que vous pouvez invoquer et il enverra des données à chaque objet demandeur. p>
(I habituellement un singleton pour cela .. même si les singletons sont souvent découragés. :)) p>