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

我有一个iOS应用程序,我在xCode中创build为“基于视图的应用程序”。 我只有一个viewController,但它会自动显示,我看不到任何代码,它绑定到我的appDelegate。 我需要从我的appDelegate传递数据到我的viewController,但不知道如何把它closures。

我的应用程序delegate.h:

#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) NSDictionary *queryStrings; @end 

另外,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; } 

您可以通过以下方式访问它

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

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

如何使用良好的老式NSNotifications从您的应用程序代表发送消息给任何听(如您的观点控制器)的东西需要更新? 或者您可以使用Key Value Observing,这样您的视图控制器就可以在您的应用程序委托中查看一些属性。

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

 UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController]; 

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

 UIWindow *window=[UIApplication sharedApplication].keyWindow; UIViewController *root = [window rootViewController]; UIStoryboard *storyboard = root.storyboard; CustomViewController *vcc =(CustomViewController *) [storyboard instantiateViewControllerWithIdentifier:@"storyBoardID"]; 

迅速做到这一点,你可以从任何地方调用这个,而不仅仅是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 } 

它作为标准function包含在:

https://github.com/goktugyil/EZSwiftExtensions

如果您使用了基于视图的应用程序模板,则应该可以通过应用程序委托中的属性访问单个视图控制器。 这是相同的视图控制器被设置为导航控制器的根视图控制器。

如果由于某种原因你的项目设置不同,你可以得到窗口的根视图控制器,它应该是导航控制器,然后得到它的顶视图控制器。

编辑:所以问题是这样的:与iOS5和故事板,苹果已经抽象了很多初始设置,你曾经有权访问(如果你select了故事板,仍然会这样做)。 他们已经改变了传递给main()的参数,并在故事板中做了更多的设置(这实际上只是一个笔尖)。 恕我直言,这部分是为了防止重载操作的人重载AppDelegate,就像你在做你的事情似的。 实质上,AppDelegate用于pipe理应用程序生命周期。 这并不是要执行将信息交给视图控制器的方法。 这是你的视图控制器的工作,真的,做繁重的工作来提供自己的数据。 我会build议移动代码到你的视图控制器,也许在viewDidLoad。 如果您需要知道launchOptions objectForKeytesting的结果,那么看起来您正在做的是,您可以非常简单地在您的AppDelegate上创build一个属性,比如说BOOL launchOptionsURLKeyExists,然后进行相应的设置。 然后你只需在你的视图控制器中获取这个属性的值。 你AppDelegate已经是单身人士,所以你可以通过[UIApplication sharedApplication] .delegate

编辑2: viewWillAppear / viewDidAppear被视为添加到您的视图控制器中的UIApplicationDidEnterForegroundNotification通知时被调用,并在发布该消息时作出适当的响应。