如何从appDelegate访问我的viewController?iOS版

Hac*_*ack 62 storyboard uiviewcontroller uikit ios

我有一个iOS应用程序,我在xCode中创建为"基于视图的应用程序".我只有一个viewController,但它会自动显示,我看不到任何代码将它与我的appDelegate联系起来.我需要将数据从我的appDelegate传递到我的viewController,但不知道如何解决这个问题.

我的app delegate.h:

#import <UIKit/UIKit.h>


@interface AppDelegate : UIResponder <UIApplicationDelegate>

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

@end
Run Code Online (Sandbox Code Playgroud)

另外,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;
}
Run Code Online (Sandbox Code Playgroud)

uta*_*hak 101

你可以用以下方式访问它:

MyViewController* mainController = (MyViewController*)  self.window.rootViewController;
Run Code Online (Sandbox Code Playgroud)

如果您将视图嵌套在tabviewcontroller或导航控制器后面,它将返回给您,您将需要访问其中的视图控制器

  • 抱歉,在这种情况下,“自我”是什么?您是指UIApplicationDelegate中的`-window`属性吗?如果是这样,则仅适用于iOS 5以上版本-只是一个提示。 (2认同)

Mic*_*ann 22

如何使用优秀的老式NSNotifications从您的应用代表发送消息给任何人(例如您的视图控制器)发送需要更新的内容?或者您可以使用键值观察,以便您的视图控制器可以在您的应用程序委托中查看某些属性.

  • +1 ...其他选项可能会导致意大利面条胶水代码。 (2认同)

Con*_*ltz 12

由于您只有一个视图控制器,通用方式(独立于您的应用程序的设置方式):

UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController];
Run Code Online (Sandbox Code Playgroud)


小智 9

如果你想得到任何其他的UIViewController,不仅仅是rootViewController:

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

UIStoryboard *storyboard = root.storyboard;
CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"];
Run Code Online (Sandbox Code Playgroud)


Esq*_*uth 6

快速做到这一点,你可以从任何地方调用它,而不仅仅是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
}
Run Code Online (Sandbox Code Playgroud)

它作为标准功能包含在:

https://github.com/goktugyil/EZSwiftExtensions