web-dev-qa-db-ja.com

AppDelegateインスタンス変数の参照

ナビゲーションベースのアプリケーションテンプレートに基づくプロジェクトがあります。 AppDelegateには、メソッド-applicationDidFinishLoading:および-applicationWillTerminate:があります。これらのメソッドでは、アプリケーションデータを読み込んで保存し、インスタンス変数に格納しています(実際にはオブジェクトグラフです)。

アプリケーションがロードされると、MainWindow.xibがロードされます。MainWindow.xibにはNavigationConrollerが含まれており、これにはRootViewControllerが含まれています。 RootViewController nibNameプロパティは、RootView(私の実際のコントローラークラス)を指します。

私のクラスでは、-applicationDidFinishLoading:メソッドで作成したオブジェクトを参照したいので、参照を取得できます。

誰もそれを行う方法を教えてもらえますか?プログラムで作成したオブジェクト間を参照する方法は知っていますが、中間ステップがNIBファイル内で行われたため、戻る方法を理解できないようです。

84
cdeerinck

アプリ内のどこからでもアクセスする必要がある変数(通常はモデルデータ構造)については、AppDelegateクラスで変数を宣言します。参照する必要がある場合:

YourAppDelegate *appDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate];
//and then access the variable by appDelegate.variable 
204
leonho

あなたの質問を理解したら、AppDelegateオブジェクトのメンバー変数/プロパティを参照したいですか?最も簡単な方法は、[[UIApplication sharedApplication] delegate]を使用してオブジェクトへの参照を返すことです。

Windowというプロパティがある場合、これを行うことができます。

UIWindow   *mainWindow = [[[UIApplication sharedApplication] delegate] window];
//do something with mainWindow
16
Ben Gottlieb

IOS4.0以降の、明確に定義されたポータブルな代替手段を次に示します。

UIApplication *myApplication = [UIApplication sharedApplication];
UIWindow *mainWindow = [myApplication keyWindow];
UIViewController *rootViewController = [mainWindow rootViewController];

または、1行で、

UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];

ウィンドウのrootViewControllerプロパティ(IBなど)を設定することを忘れないでください。そうしないと、ジャッキが実行されます。

11
SK9

マクロを定義して、どこでも使用できます!

#define appDelegateShared ((AppDelegate *)[UIApplication sharedApplication].delegate)

私のコードで:-

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
2
dreamBegin