6

iPhone 프로그래밍에서 AppDelegate = [[UIApplication sharedApplication] delegate]에서 navController를 얻는 방법이 궁금합니다. 예를 들어 AppDelegate를 참조하는 다른 viewController에서AppDelegate에서 navController를 얻는 방법.

UINavigationController *navController; 

그리고하여 MainWindow를에서 navController를 얻을 수 어쨌든

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

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

applicationDelegate.m에 있나요 다음 다음 applicationDelegate.h에서

우리는이

UIWindow *mainWindow = [appDelegate window]; 
+1

왜 Nav 컨트롤러를 앱 대리인의 속성으로 설정하지 않습니까? –

+0

mainWindow (UIWindow * mainWindow = [appDelegate window])에서만 navController에 대한 정보를 얻을 필요가 있습니다. – ramo

+0

아니 겠지. 그런데 왜 애플 리케이션 델리게이트를 사용할 수 없습니까? –

답변

17

, 당신은 단순히 호출 할 수

UINavigationController *navController = self.navigationController; 

을의 UIViewController에서.

그렇지 않으면 UINavigationController를 AppDelegate의 속성으로 설정할 수 있습니다.

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

그런 다음 액세스 appDelegate.navController.

또는, 윈도우의 rootViewController로 UINavigationController가 설정할 수 있습니다

[window setRootViewController:navController]; 

어디서나 전화 : 엑스트라 특성이 필요하지

UINavigationController *navController = window.rootViewController; 
+0

매우 유익한 정보! 고맙습니다! 하나의 질문 : 만약 당신이'window'를 통해 navController에 접근하려고한다면, UIApplication을 통해 접근 할 필요가 없습니까? 아마 더 짧은 길이 있습니까? – JohnK

+0

'window' 속성을 사용하여 모든 UIView에서 창으로 이동할 수 있습니다. – Lucien

1

navController을 대리인 클래스의 속성으로 만들 수 있습니다. 샘플 아래 :

applicationDelegate.h에서

applicationDelegate.m에서
@property (retain, nonatomic) UINavigationController *navController; 

@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에 학습자 경우 viewcontroller를 사용하여 모든 viewcontroller (해당 컨트롤러가 푸시 된 경우에만)의 navigationcontroller에 액세스 할 수 있습니다. 컨트롤러를 밀면 네비게이션 컨트롤러의 "스택"에 추가됩니다.

해당 viewcontroller 자체의 자체 개체를 사용하여 탐색 컨트롤러에 액세스 할 수 있습니다.

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

네비게이션 해부학에 대한 완전한 지식을 제공합니다. 이 다른 UIViewController에이 UINavigationController가 포함되어있는 경우

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에 직접 접근 할 수 없다.