0
votes

Comment accéder à la propriété de CityController à partir d'Appdelegate s'il est dans TabbarController?

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:

 Entrez la description de l'image ici xxx


0 commentaires

3 Réponses :


1
votes

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()
  • avoir une sorte de 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>


0 commentaires

2
votes

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.

Une meilleure approche serait de définir votre propre notification notification . Publier cette notification de l'application déléguée avec la charge utile nécessaire (l'URL).

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.

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.


1 commentaires

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) ET @OBJC Func Handlerdirect (Notification: NSnotification) {OAuth2.HandderDirecturl (notification.Object as! URL)} Ainsi dans Appdelegate Just NotificationCenter.default.post (Nom: NSNOTIFICATION.NAME (RAWVALUE: Oauth2appdidreceivecallAnnotification), objet: URL)



1
votes

La bonne approche doit être d'avoir une "DataSource" / "dbmanager" que vous pouvez invoquer et il enverra des données à chaque objet demandeur.

(I habituellement un singleton pour cela .. même si les singletons sont souvent découragés. :))


0 commentaires