当应用程序变为活动状态时,viewWillAppear不会在我的视图控制器中调用

免责声明:我是iOS的noob。

我使用Xcode的模板创build了一个基于视图的应用程序,将图片上传到网站。 Xcode自动为我创build了AppDelegate.m(&.h)和ViewController.m以及一个storyboard。 该应用程序使用URL架构从网站启动,并在视图控制器中使用该信息。 我有两个问题:

1)这是一个很好的方式从我的AppDelegate传递查询string到视图控制器?
我有一个名为queryStrings我的AppDelegate中存储查询string的NSDictionary属性。 然后在viewWillAppear在我的视图控制器我使用下面的代码来访问它:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSDictionary *queryStrings = appDelegate.queryStrings; wtID = [queryStrings valueForKey:@"wtID"]; 

2)当应用程序已经启动,但在后台,用户通过网页上的url(使用不同的查询string)再次打开应用程序,我已经实现了AppDelegate中的openURL,它填充我的AppDelegate中的queryStrings属性。 问题是:视图控制器的viewWillAppear方法永远不会被调用,所以上面的代码不会被执行。 如何获取查询string数据到视图控制器? 视图控制器如何知道该应用程序刚刚变为活动?

注意:因为该项目是使用Xcode中的“基于视图的应用程序”模板创build的,所以我的AppDelegate的唯一属性是窗口属性。 我无法知道我的视图控制器甚至被AppDelegate引用的代码中的位置…它从来没有被设置为rootViewController或代码中的任何东西……我想这只是一些IB魔法,我看不到。

万一它有帮助,这是我的AppDelegate.h:

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

这里是我didFinishLoadingWithOptions,openURL和我的帮手方法:parseQueryString:

 - (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; } -(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { NSLog(@"openURL executed"); if (!url) return NO; NSLog(@"query string: %@", [url query]); queryStrings = [self parseQueryString:[url query]]; mainViewController.wtID = [queryStrings valueForKey:@"wtID"]; return YES; } -(NSDictionary *)parseQueryString:(NSString *)query { NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithCapacity:6]; NSArray *pairs = [query componentsSeparatedByString:@"&"]; for (NSString *pair in pairs) { NSArray *elements = [pair componentsSeparatedByString:@"="]; NSString *key = [[elements objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *val = [[elements objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [dictionary setObject:val forKey:key]; } return dictionary; } 

提前致谢!

所以,故事板开始让我紧张,我甚至不build立你的应用程序! 🙂

正如我在你的另一个问题(这是一个重复的,但是嘿)中所说的,缺less对视图控制器的引用是由于故事板。 viewDidAppear和viewWillAppear在视图添加到层​​次结构时被调用。 去往和来自背景和前景没有资格被添加到层次结构。 幸运的是,您的应用程序会发送与AppDelegate中的方法相对应的通知。 只需注册为UIApplicationWillEnterForegroundNotification通知的观察者即可。 然后,您可以更新您的用户界面的方法,因为收到该通知而被解雇!

编辑:添加到重复的问题的链接好措施: 如何从我的appDelegate访问我的viewController? iOS版

嗯,那么为什么你的AppDelegate没有声明UIViewController呢?

UPDATE

当你创build一个新的项目,你应该在你的AppDelegate

 @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) UIViewController *viewController; @end 

//

 #import "ViewController.h" @implementation AppDelegate @synthesize window, viewController; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewController = [[ViewController alloc] init]; [self.window setRootViewController:self.viewController]; [self.window makeKeyAndVisible]; return YES; } //... @end