免責事項: 私は iOS 初心者です。
写真を Web サイトにアップロードする Xcode のテンプレートを使用して、ビュー ベースのアプリを作成しました。Xcode は、AppDelegate.m (& .h) と ViewController.m、およびストーリーボードを自動的に作成しました。アプリは URL スキーマを使用して Web サイトから起動され、ビュー コントローラーでその情報を使用します。2 つの質問があります。
1)これは、AppDelegate からビュー コントローラーにクエリ文字列を渡す良い方法ですか?
クエリ文字列を格納する queryStrings という AppDelegate に NSDictionary プロパティがあります。次に、ビュー コントローラーの viewWillAppear で、次のコードを使用してアクセスします。
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSDictionary *queryStrings = appDelegate.queryStrings;
wtID = [queryStrings valueForKey:@"wtID"];
2) アプリが既に起動されているがバックグラウンドで、ユーザーが Web ページの URL を介して (別のクエリ文字列を使用して) アプリを再度開いた場合、AppDelegate に私の queryStrings プロパティを設定する openURL を AppDelegate に実装しました。問題は、View Controller の viewWillAppear メソッドが呼び出されないため、上記のコードが実行されないことです。クエリ文字列データをビュー コントローラーに取得するにはどうすればよいですか? View Controller は、アプリがアクティブになったことをどのように認識しますか?
注: プロジェクトは Xcode の「ビューベース アプリ」テンプレートを使用して作成されたため、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;
}
前もって感謝します!