gpt4 book ai didi

ios - 当应用程序处于事件状态时,不会在我的 View Controller 中调用 viewWillAppear

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:52:28 26 4
gpt4 key购买 nike

免责声明:我是 iOS 菜鸟。

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

1) 这是将查询字符串从我的 AppDelegate 传递到 View Controller 的好方法吗?
我的 AppDelegate 中有一个名为 queryStrings 的 NSDictionary 属性,它存储查询字符串。然后在我的 View Controller 中的 viewWillAppear 中,我使用以下代码访问它:

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

2) 当应用程序已经启动但在后台并且用户通过网页上的 url(使用不同的查询字符串)再次打开应用程序时,我在 AppDelegate 中实现了 openURL,它填充了我在 AppDelegate 中的 queryStrings 属性。问题是:永远不会调用 View Controller 的 viewWillAppear 方法,因此不会执行上面的代码。如何将查询字符串数据获取到 View Controller ? View Controller 如何知道应用程序刚刚激活?

注意:因为该项目是使用 Xcode 中的“基于 View 的应用程序”模板创建的,所以我的 AppDelegate 具有的唯一属性是 window 属性。我不知道我的 View Controller 在代码中的哪个位置甚至被 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;
}

提前致谢!

最佳答案

因此, Storyboard开始让我心烦意乱,我什至没有构建您的应用程序! :)

正如我在您的其他问题中所述(这是一个重复的问题,但是嘿),缺少对 View Controller 的引用是由于 Storyboard。将 View 添加到层​​次结构时调用 viewDidAppear 和 viewWillAppear。进出后台和前台不符合添加到层次结构的条件。幸运的是,您的应用程序发送与 AppDelegate 中的方法相对应的通知。只需注册为 UIApplicationWillEnterForegroundNotification 通知的观察者。然后,您可以在收到该通知后触发的方法中更新您的 UI!

编辑: 将链接添加到重复的问题以取得良好的效果:How do I access my viewController from my appDelegate? iOS

关于ios - 当应用程序处于事件状态时,不会在我的 View Controller 中调用 viewWillAppear,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10017305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com