2

免責事項: 私は 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;
}

前もって感謝します!

4

2 に答える 2

1

だから、ストーリーボードは私の神経質になり始めており、私はあなたのアプリを構築していません! :)

他の質問で述べたように (これは重複していますが、ねえ)、View Controller への参照がないのはストーリーボードが原因です。ビューが階層に追加されると、viewDidAppear と viewWillAppear が呼び出されます。バックグラウンドとフォアグラウンドを行き来することは、階層に追加されるとは見なされません。幸いなことに、アプリは AppDelegate のメソッドに対応する通知を送信します。UIApplicationWillEnterForegroundNotification 通知のオブザーバーとして登録するだけです。次に、その通知を受け取った結果として起動されるメソッドで UI を更新できます。

編集:適切な測定のために重複した質問へのリンクを追加する: appDelegate から viewController にアクセスするにはどうすればよいですか? iOS

于 2012-04-04T19:32:48.363 に答える
0

うーん、では、なぜUIViewController宣言されていないのAppDelegateですか?

アップデート

新しいプロジェクトを作成すると、次のように smth が含まれているはずです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
于 2012-04-04T18:48:47.400 に答える