84 votes

UIApplication.shared.delegate équivalent pour SceneDelegate xcode11 ?

J'ai défini une propriété let dans mon SceneDelegate. J'aimerais que certains ViewControllers puissent y accéder dans la scène.

Dans UIKit, je pouvais accéder aux propriétés de App Delegate comme ceci :

UIApplication.shared.delegate

puis casting et spécification du nom de la propriété...

Existe-t-il un équivalent pour obtenir la référence au SceneDelegate dans lequel se trouve le contrôleur de vue à partir de l'instance de UIViewController ?

5voto

michael Points 1041

Je stocke la référence de SceneDelegate dans un fichier static weak et l'initialiser dans scene(:willConnectTo:options)

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    static weak var shared: SceneDelegate?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        Self.shared = self
    }
}

On peut accéder à la scène ultérieure en utilisant SceneDelegate.shared

2voto

malcolmhall Points 1909

Je l'utilise dans mon MasterViewController :

- (void)viewDidLoad {
    [super viewDidLoad];

    SceneDelegate *sceneDelegate = (SceneDelegate *)self.parentViewController.view.window.windowScene.delegate;
}

self.view.window est nulle à ce stade, je dois donc atteindre le parent dont la vue a déjà été chargée et ajoutée à la fenêtre.

Si vous utilisez un contrôleur de vue divisé et que le délégué de la scène est le délégué divisé, vous pouvez alors éviter complètement la fenêtre/scène et vous contenter de faire :

SceneDelegate *sceneDelegate = (SceneDelegate *)self.splitViewController.delegate;

Je l'utilise dans mon DetailViewController .

0voto

Prakash Raj Points 121

Parfois la fenêtre devient nulle, vous pouvez vérifier le nom du storyboard sous plist, veuillez vous référer à l'image - enter image description here

0voto

dengST30 Points 159

La version Objective-C :

    NSSet<UIScene *> * sceneArr = [[UIApplication sharedApplication] connectedScenes];
    UIScene * scene = [[sceneArr allObjects] firstObject];
    NSObject * sceneDelegate = (NSObject *)scene.delegate;

    // for example, try to get variable "window"
    UIWindow *currentKeyWindow = [sceneDelegate valueForKey: @"window"];
    NSLog(@"%@", currentKeyWindow);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X