web-dev-qa-db-fra.com

Comment accéder à mon viewController à partir de mon appDelegate? iOS

J'ai créé une application iOS en tant qu '"application basée sur les vues" dans xCode. Je n'ai qu'un seul viewController, mais il s'affiche automatiquement et je ne vois aucun code le liant à mon appDelegate. Je dois transmettre des données de mon appDelegate à mon viewController, mais je ne sais pas comment les récupérer.

Mon délégué app.h:

#import <UIKit/UIKit.h>


@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) NSDictionary *queryStrings;

@end

En outre, appDidFinishLoadingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [[JMC sharedInstance] configureJiraConnect:@"https://cmsmech.atlassian.net/"           projectKey:@"WTUPLOAD" apiKey:@"7fc060e1-a795-4135-89c6-a7e8e64c4b13"];

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsURLKey] != nil) {
        NSURL *url = [launchOptions objectForKey: UIApplicationLaunchOptionsURLKey];
        NSLog(@"url received: %@", url);
        NSLog(@"query string: %@", [url query]);
        NSLog(@"Host: %@", [url Host]);
        NSLog(@"url path: %@", [url path]);
        queryStrings = [self parseQueryString:[url query]];
        NSLog(@"query dictionary: %@", queryStrings);
    }
    else {
        queryStrings = [self parseQueryString:@"wtID=nil"];
    }

    return YES;
}
62
HackyStack

Vous pouvez y accéder avec:

MyViewController* mainController = (MyViewController*)  self.window.rootViewController;

Si vous imbriquez votre vue derrière un contrôleur de navigation ou un contrôleur de navigation tabview, elle vous le renverra et vous devrez accéder à votre contrôleur de vue à l'intérieur de celui-ci.

101
utahwithak

Que diriez-vous d’utiliser un bon vieux NSNotifications pour envoyer un message de votre délégué d’application à toute personne écoutant (par exemple, votre observateur de la vue) que quelque chose doit être mis à jour? ou vous pouvez utiliser observation de la valeur de clé pour que votre contrôleur de vue puisse surveiller certaines propriétés de votre délégué d'application.

20

Comme vous n’avez qu’un seul contrôleur de vue, la méthode générique (quelle que soit la configuration de votre application):

UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController];
12
Conrad Shultz

Si vous voulez obtenir un autre UIViewController, pas seulement le rootViewController:

UIWindow *window=[UIApplication sharedApplication].keyWindow;
UIViewController *root = [window rootViewController];

UIStoryboard *storyboard = root.storyboard;
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"];
9
Arben Pnishi

Manière rapide de le faire, vous pouvez appeler cela de n'importe où, pas seulement appdelegate:

/// EZSwiftExtensions - Gives you the VC on top so you can easily Push your popups
public var topMostVC: UIViewController? {
    var presentedVC = UIApplication.sharedApplication().keyWindow?.rootViewController
    while let pVC = presentedVC?.presentedViewController {
        presentedVC = pVC
    }

    if presentedVC == nil {
        print("EZSwiftExtensions Error: You don't have any views set. You may be calling them in viewDidLoad. Try viewDidAppear instead.")
    }
    return presentedVC
}

Son inclus en tant que fonction standard dans:

https://github.com/goktugyil/EZSwiftExtensions

6
Esqarrouth

Si vous avez utilisé le modèle d'application basée sur une vue, le contrôleur d'affichage unique devrait être accessible via une propriété du délégué de votre application. C'est le même contrôleur de vue qui est défini comme contrôleur de vue racine du contrôleur de navigation.

Si, pour une raison quelconque, votre projet a été configuré différemment, vous pouvez obtenir le contrôleur de vue racine de la fenêtre, qui doit être le contrôleur de navigation, puis obtenir son contrôleur de vue supérieure.

EDIT: Le problème est donc le suivant: avec iOS5 et les scénarimages, Apple a résumé une grande partie de la configuration initiale à laquelle vous aviez accès (et le restez si vous désactivez les story-boards). Ils ont modifié les arguments passés à main () et en font plus de la configuration dans le storyboard (qui est À mon humble avis, c’est en partie pour empêcher les gens de surcharger l’AppDelegate avec des opérations lourdes, comme il semblerait que vous le fassiez dans le vôtre. L’AppDelegate existe, en substance, pour gérer le cycle de vie de l’application. Effectuer des méthodes qui transmettent des informations à vos contrôleurs de vue. C’est le travail de votre contrôleur de vue, de faire le gros du travail pour se fournir lui-même des données. Je suggérerais de déplacer le code dans votre contrôleur de vue, peut-être dans viewDidLoad. connaître le résultat du test launchOptions objectForKey, il semble que vous le fassiez, vous pouvez très simplement créer une propriété sur votre AppDelegate, par exemple BOOL launchOptionsURL KeyExists, et définissez-le correctement. Ensuite, il vous suffit de saisir la valeur de cette propriété dans votre contrôleur de vue. Vous AppDelegate est déjà un singleton, vous pouvez donc y accéder soit par [UIApplication sharedApplication] .delegate

EDIT 2: viewWillAppear/viewDidAppear est appelé lorsque la vue est ajoutée à la notification UIApplicationDidEnterForegroundNotification dans votre contrôleur de vue et répond de manière appropriée lorsque ce message est posté.

0
jmstone617