web-dev-qa-db-de.com

Wie greife ich von meinem appDelegate aus auf meinen viewController zu? iOS

Ich habe eine iOS-App, die ich als "ansichtsbasierte App" in xCode erstellt habe. Ich habe nur einen viewController, dieser wird jedoch automatisch angezeigt und es wird kein Code angezeigt, der ihn mit meinem appDelegate verknüpft. Ich muss Daten von meinem appDelegate an meinen viewController übergeben, weiß aber nicht, wie ich das ausführen soll.

Meine App delegate.h:

#import <UIKit/UIKit.h>


@interface AppDelegate : UIResponder <UIApplicationDelegate>

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

@end

Auch 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

Sie können darauf zugreifen mit:

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

Wenn Sie Ihre Ansicht hinter einem TabView-Controller oder Navigations-Controller verschachteln, wird dies an Sie zurückgegeben, und Sie müssen auf Ihren View-Controller darin zugreifen

101
utahwithak

Wie wäre es mit altmodisch NSNotifications , um eine Nachricht von Ihrem App-Delegaten an jeden zu senden, der zuhört (z. B. Ihren View Contorller), dass etwas aktualisiert werden muss? oder Sie können Key Value Observing verwenden, damit Ihr View Controller eine Eigenschaft in Ihrem App-Delegaten überwacht.

20

Da Sie nur einen Ansichtscontroller haben, der generische Weg (unabhängig davon, wie Ihre App eingerichtet wurde):

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

Wenn Sie andere UIViewController erhalten möchten, nicht nur die rootViewController:

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

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

Schneller Weg, dies zu tun, Sie können dies von jedem Ort aus aufrufen, nicht nur von 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
}

Es ist standardmäßig enthalten in:

https://github.com/goktugyil/EZSwiftExtensions

6
Esqarrouth

Wenn Sie die Vorlage View-Based Application verwendet haben, sollte der einzelne View-Controller über eine Eigenschaft in Ihrem App-Delegaten erreichbar sein. Es ist derselbe Ansichtscontroller, der als Stammansichtscontroller des Navigationscontrollers festgelegt wird.

Wenn Ihr Projekt aus irgendeinem Grund anders eingerichtet wurde, können Sie den Stammansichts-Controller des Fensters, der der Navigations-Controller sein sollte, und anschließend den Draufsicht-Controller abrufen.

EDIT: Das Problem ist also: Mit iOS5 und Storyboards hat Apple abstrahiert Viele der anfänglichen Einstellungen, auf die Sie früher Zugriff hatten (und die Sie immer noch machen, wenn Sie Storyboards deaktivieren). Sie haben die Argumente geändert, die an main () übergeben wurden, und haben mehr von den Einstellungen im Storyboard (das heißt) vorgenommen Dies ist meiner Meinung nach ein Teil der Aufgabe, Menschen davon abzuhalten, das AppDelegate mit schweren Vorgängen zu überlasten, wie es bei Ihnen der Fall zu sein scheint. Das AppDelegate dient im Wesentlichen der Verwaltung des Anwendungslebenszyklus Führen Sie Methoden aus, die Informationen an Ihre View-Controller weitergeben. Es ist im Grunde die Aufgabe Ihres View-Controllers, sich selbst mit Daten zu versorgen. Ich würde vorschlagen, den Code in Ihren View-Controller zu verschieben, vielleicht in viewDidLoad. Wenn Sie müssen Wenn Sie das Ergebnis des launchOptions objectForKey-Tests kennen, den Sie anscheinend ausführen, können Sie ganz einfach eine Eigenschaft in Ihrem AppDelegate erstellen, z. B. BOOL launchOptionsURL KeyExists, und stellen Sie es entsprechend ein. Dann greifen Sie einfach auf den Wert dieser Eigenschaft in Ihrem View-Controller zu. Ihr AppDelegate ist bereits ein Singleton, sodass Sie entweder über [UIApplication sharedApplication] .delegate darauf zugreifen können

EDIT 2: viewWillAppear/viewDidAppear wird aufgerufen, wenn die Ansicht der UIApplicationDidEnterForegroundNotification-Benachrichtigung in Ihrem Ansichtscontroller hinzugefügt wird, und reagiert entsprechend, wenn Diese Nachricht wird gepostet.

0
jmstone617