66

xCode で「ビューベースのアプリ」として作成した iOS アプリがあります。viewController は 1 つしかありませんが、自動的に表示され、それを appDelegate に関連付けるコードが表示されません。appDelegate から viewController にデータを渡す必要がありますが、その方法がわかりません。

私のアプリの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;
}
4

6 に答える 6

108

次の方法でアクセスできます。

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

ビューをタブビューコントローラーまたはナビゲーションコントローラーの背後にネストしている場合、それが返され、その中のビューコントローラーにアクセスする必要があります

于 2012-04-04T16:45:08.257 に答える
22

古き良き時代のNSNotificationsを使用して、何かを更新する必要があることを聞いている人 (ビュー コントローラーなど) にアプリ デリゲートからメッセージを送信するのはどうですか? または、Key Value Observingを使用して、View Controller がアプリ デリゲートのプロパティを監視できるようにすることもできます。

于 2012-04-04T16:45:48.757 に答える
12

View Controllerは1つしかないため、一般的な方法(アプリの設定方法とは無関係):

UIViewController *vc = [[[UIApplication sharedApplication] keyWindow] rootViewController];
于 2012-04-04T16:46:34.307 に答える
0

ビューベースのアプリケーションテンプレートを使用した場合は、アプリデリゲートのプロパティを介して単一のビューコントローラーにアクセスできる必要があります。これは、ナビゲーションコントローラーのルートビューコントローラーとして設定されるのと同じビューコントローラーです。

何らかの理由でプロジェクトの設定が異なる場合は、ウィンドウのルートビューコントローラー(ナビゲーションコントローラー)を取得してから、そのトップビューコントローラーを取得できます。

編集: したがって、問題は次のとおりです。iOS5とストーリーボードを使用して、Appleは、以前アクセスできた(ストーリーボードをオプトアウトした場合でも実行できる)初期設定の多くを抽象化しました。彼らはmain()に渡される引数を変更し、ストーリーボード(実際には単なるペン先)でより多くの設定を行います。私見、これは部分的に、あなたがあなたの中で行っているように見えるように、人々が重い操作でAppDelegateに過負荷をかけないようにするためです。AppDelegateは、本質的に、アプリケーションのライフサイクルを管理するために存在します。ビューコントローラに情報を渡すメソッドを実行することを意図したものではありません。実際、データを提供するために手間のかかる作業を行うのは、ビューコントローラの仕事です。おそらくviewDidLoadで、コードをViewControllerに移動することをお勧めします。実行しているように見えるlaunchOptionsobjectForKeyテストの結果を知る必要がある場合は、AppDelegateにBOOL launchOptionsURLKeyExistsなどのプロパティを作成し、適切に設定するだけです。次に、ViewControllerでこのプロパティの値を取得します。AppDelegateはすでにシングルトンであるため、[UIApplicationsharedApplication].delegateからアクセスできます。

編集2:ビューがビューコントローラのUIApplicationDidEnterForegroundNotification通知に追加されると、viewWillAppear / viewDidAppearが呼び出され、そのメッセージが投稿されたときに適切に応答します。

于 2012-04-04T16:56:47.093 に答える