6

我想知道,如何在iPhone編程中從AppDelegate = [[UIApplication sharedApplication] delegate]獲得navController。例如,在我們引用AppDelegate的其他viewController中。如何從AppDelegate獲取navController。

在applicationDelegate.h我們:

UINavigationController *navController; 

而且在applicationDelegate.m以下

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

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

反正有從主窗口得到navController:

UIWindow *mainWindow = [appDelegate window]; 
+1

爲什麼不讓您的導航控制器成爲您的應用程序委託的屬性? – 2012-04-06 06:25:01

+0

我只需要通過mainWindow(UIWindow * mainWindow = [appDelegate窗口])獲得有關navController的信息,這是可能的。 – ramo 2012-04-06 06:41:06

+0

我想沒有。但是,爲什麼你不能使用應用程序委託呢? – 2012-04-06 06:54:05

回答

17

如果其他的UIViewController包含在UINavigationController的,你可以簡單地調用:

UINavigationController *navController = self.navigationController; 

從UIViewController中。

否則,您可以將UINavigationController設置爲AppDelegate中的一個屬性。

// AppDelegate.h 
@property (nonatomic, strong) UINavigationController *navController; 

然後訪問appDelegate.navController

或者,您可以設置的UINavigationController作爲窗口RootViewController的:

[window setRootViewController:navController]; 

並調用從任何地方:在使用本宏定義你的應用程序

UINavigationController *navController = window.rootViewController; 
+0

非常有教育意義!謝謝!但有一個問題:如果你要通過'window'訪問navController,你不需要通過UIApplication訪問嗎?有沒有更短的路? – JohnK 2013-06-25 18:41:58

+0

你可以從任何具有'window'屬性的UIView到達窗口。 – Lucien 2013-06-29 13:48:18

1

您可以將navController作爲委託類的屬性。下面的示例:

在applicationDelegate.h

@property (retain, nonatomic) UINavigationController *navController; 

在applicationDelegate.m

@synthesize 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和學習者,導航控制器在整個應用程序,這將只是準備您的應用程序的「棧」中共享viewcontrollers,所以你可以在應用程序中訪問任何viewcontroller中的navigationcontroller(只有當該控制器被推送時)。當你推動任何控制器時,它將被添加到導航控制器的「堆棧」中。

您可以使用該視圖控制器本身的自我對象訪問導航控制器。

[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頭文件中,那麼您可以像使用main變量一樣使用mainNavController。

例如:

[mainNavController pushViewController:myViewController animated:YES]; 

或不宏,直接在代碼:

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

您可以在幾乎任何地方使用此代碼,這是方便的,如果你在一個類的內部工作,你不能直接訪問ViewController。

相關問題