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


84

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

アプリケーションが読み込まれると、MainWindow.xibが読み込まれます。MainWindow.xibにはNavigationConrollerがあり、MainWindow.xibにはRootViewControllerがあります。RootViewControllernibNameプロパティは、RootView(実際のコントローラークラス)を指します。

私のクラスでは、-applicationDidFinishLoading:メソッドで作成したオブジェクトを参照して、そのオブジェクトへの参照を取得できるようにしたいと思います。

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

回答:


204

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

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

7
キャストを追加したので、これに投票しました。設定した独自のプロパティを表示するには、AppDelegateを独自のタイプにキャストする必要があります。ただし、「AppDelegate」にキャストしないことで、これをより明確にするために編集できます...
Kendall Helmstetter Gelner

アプリのデリゲート名またはそのメンバーを参照せずにルートビューコントローラーにアクセスする方法はありますか?(ルートビューコントローラーを必要とするポータブルコードを記述したい。)
SK9 2011

SK9、すべてのiOSアプリにはappDelegateが必要なので、コードは移植可能です。
ダニエル

16

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

windowというプロパティがある場合は、次のようにすることができます。

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

11

iOS4.0以降の明確に定義されたポータブルな代替手段は次のとおりです。

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

または、一行で、

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

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


2

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

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

私のコードでは:-

UIViewController *rootViewController = appDelegateShared.window.rootViewController;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.