AppDelegate 인스턴스 변수 참조


84

탐색 기반 애플리케이션 템플릿을 기반으로하는 프로젝트가 있습니다. AppDelegate에는 메서드 -applicationDidFinishLoading:-applicationWillTerminate:. 이 메서드에서 저는 애플리케이션 데이터를로드 및 저장하고 인스턴스 변수 (실제로는 객체 그래프)에 저장합니다.

응용 프로그램이로드되면 NavigationConroller가있는 MainWindow.xib를로드하고 차례로 RootViewController를 갖습니다. RootViewController nibName속성은 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

SK9, 모든 iOS 앱에는 appDelegate가 있어야하므로 코드를 이식 할 수 있습니다!
Daniel

16

질문을 이해한다면 AppDelegate 개체의 멤버 변수 / 속성을 참조하고 싶습니까? 가장 간단한 방법은 [[UIApplication sharedApplication] delegate]를 사용하여 객체에 대한 참조를 반환하는 것입니다.

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.