6

iPhoneプログラミングでAppDelegate = [[UIApplication sharedApplication] delegate]からnavControllerを取得する方法が不思議です。たとえば、AppDelegateを参照する他のviewControllerにあります。AppDelegateからnavControllerを取得する方法。

UINavigationController *navController; 

そして、メインウィンドウからからNavControllerを取得するために、とにかく

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    [window addSubview: navController.view]; 
    [window makeKeyAndVisible]; 
} 

applicationDelegate.mであり、以下:applicationDelegate.hで

我々は持っている

UIWindow *mainWindow = [appDelegate window]; 
+1

navコントローラをあなたのアプリケーションデリゲートのプロパティにしてみませんか? –

+0

navControllerに関する情報をmainWindow(UIWindow * mainWindow = [appDelegateウィンドウ])だけで取得する必要があります。 – ramo

+0

私はそうは思わない。しかし、なぜあなたは本当にアプリデリゲートを使用できませんか? –

答えて

17

この他のUIViewControllerはUINavigationControllerに含まれている場合は、単純に呼び出すことができます。

UINavigationController *navController = self.navigationController; 

のUIViewControllerから。

それ以外の場合は、AppDelegateのプロパティとしてUINavigationControllerを設定できます。

appDelegate.navControllerにアクセスします。

それとも、あなたは窓のrootViewControllerとしてUINavigationControllerを設定することができます。

[window setRootViewController:navController]; 

、どこからでも呼び出す:余分なプロパティは必要ありません

UINavigationController *navController = window.rootViewController; 
+0

非常に有益!ありがとうございました!しかし、1つの質問:もしあなたが 'window'を通してnavControllerにアクセスしようとするなら、あなたはUIApplicationを通してアクセスする必要はありませんか?おそらくもっと短い方法はありますか? – JohnK

+0

'window'プロパティを持つ任意のUIViewからウィンドウにアクセスできます。 – Lucien

1

navControllerをデリゲートクラスのプロパティとして使用することができます。以下のサンプル:applicationDelegate.h

applicationDelegate.m

@synthesize navController; 

@property (retain, nonatomic) UINavigationController *navController; 

その後、あなたは他のクラスでからNavControllerを取得するには、次のコードを使用することができます(あなたの委譲クラスがMyApplicationDelegateであると仮定):

appDelegate = (MyApplicationDelegate*)[[UIApplication sharedApplication] delegate]; 
UINavigationController *navController = appDeleagte.navController 
2

navCo ntrollerプロパティ

@property (nonatomic,strong) UINavigationController *navController; 

それからちょうどあなたのappdelegateからアクセス

appDelegate.Controller 
-1

あなたはナビゲーションコントローラは、単にアプリのの「スタック」を準備するアプリケーション全体で共有され、beginerと学習者であれば(つまりコントローラがプッシュされている場合のみ)任意のviewcontrollerのナビゲーションコントローラにアクセスすることができます。いずれかのコントローラーを押すと、ナビゲーションコントローラーの「スタック」に追加されます。

ナビゲーションコントローラにアクセスするには、そのビューコントローラ自体の自己オブジェクトを使用します。

[self.navigationController pushViewController:detail animated:YES]; 

ナビゲーションの解剖学の完全な知識を提供します。

http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html

1

このマクロ定義を使用して、アプリケーションにほとんどどこでも利用できます、:

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

マクロをあなたの一番上に置くとrソースまたはソースにインポートする.hヘッダーファイルで、mainNavControllerをローカル変数のように使用することができます。例えば

[mainNavController pushViewController:myViewController animated:YES]; 

またはマクロせずに、直接コード内:あなたはクラスの内部で作業している場合

AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
appDelegate.navController; // do something with the navController 

あなたは便利である、ほとんどどこでもこのコードを使用することができますし、 ViewControllerに直接アクセスすることはできません。

関連する問題