2010-05-17 6 views
6

저는 Xcode에서 iPad의 SplitView 템플릿으로 놀았습니다. 여기왜 내 응용 프로그램 대리인의 didFinishLaunchingWithOptions 메서드가 갑자기 RootViewController : viewDidLoad 메서드 이후에 호출되는 것입니까?

AppNameAppDelegate.m

#pragma mark - 
#pragma mark Application lifecycle 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    // Override point for customization after app launch  
    rootViewController.managedObjectContext = self.managedObjectContext; 


    // Add the split view controller's view to the window and display. 
    [window addSubview:splitViewController.view]; 
    [window makeKeyAndVisible]; 

    return YES; 
} 

RootViewController.m ... 자동으로 생성 된 분할 뷰 기반의 애플리케이션 템플릿에 의해 당신을 위해 많은 중요한 방법의 두 가지

#pragma mark - 
#pragma mark View lifecycle 

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    self.clearsSelectionOnViewWillAppear = NO; 
    self.contentSizeForViewInPopover = CGSizeMake(320.0, 600.0); 

    NSError *error = nil; 
    if (![[self fetchedResultsController] performFetch:&error]) { 

     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
} 

변경하기 전에 프로젝트를 빌드하고 실행할 때전에 application:didFinishLaunchingWithOptions 메서드가 호출됩니다.메서드가 호출됩니다. 저는 iPhone 개발에 익숙하지 않지만 이것이 올바른 순서라고 가정합니다. 그래서 여기 내가 만든 변경 ... 나는 모든 수정없이 일하고 확인되면

  • , 나는 RootViewController 코드를 변경하고 UIViewController (대신 기본적으로 UITableViewController)의 서브 클래스로 설정하고 각각을했다입니다 Interface Builder에서 조정. 내가 만들었고 달렸는데, 모든 것은 여전히 ​​잘 작동했다.
  • 그런 다음 IB의 RootView에 UIView를 추가했습니다. 빌드하고 실행할 때 갑자기 RootViewController:viewDidLoadapplication:didFinishLaunchingWithOptions 메서드 전에 호출되었습니다.

난 당신이 코드에서 볼 수 있듯이, 다시이 때문에 이전에 일하던 방식을 얻을 필요는있는 viewDidLoad 방법은 그래서 설정할 수 있습니다 실행 didFinishLauchingWithOptions 방법에 따라 달라집니다 rootViewController의 managedObjectContext이 수행하는 데 사용하는 가져 오기 요청.

  1. 어떤 결과가 발생 했습니까?
  2. 어떤 문제를 해결할 수 있을까요?

도움을 위해 미리 감사드립니다. 나는 계속 코드를 연구하고 놀거야.

답변

4

뷰로드 일으키는 원인이되는 창으로 RootViewController의보기를 추가하기 전에, 그 때문에, 루트 뷰 컨트롤러의 viewDidLoad 메소드가 호출되도록 할 수 있습니다 분명히 -viewDidLoad가 따라옵니다 - applicationDidFinishLaunching.

ViewDidLoad는 (간접적으로) applicationDidFinishLaunching에서 호출됩니다.

viewDidLoad가 applicationDidFinishLaunching 전에 호출되는 경우 applicationDidFinishLaunching이 호출되기 전에보기가로드되도록하기 위해 수행 한 작업 때문입니다.

-viewDidLoad에 중단 점을 추가하고 스택 트레이스를보고 어떤 점을 호출했는지 확인 했습니까?

2

여기서 RootViewController을 초기화 하시겠습니까? 일반적으로 applicationDidFinishLaunching (적어도 iPhone에서는)입니다. 앱의 대리인의 init 방법을 초기화 할 경우 템플릿 응용 프로그램 -applicationDidFinishLaunching에서 applicationDidFinishLaunching.

+0

감사합니다. eman! SplitView 기반 응용 프로그램 템플릿은 RootViewController에 대한 초기화 코드를 생성하지 않습니다. 적어도 어디서나 볼 수는 없습니다. 그래서 iPad 개발을 처음 접했을 때부터 지금까지 내가 배운 내용을 토대로 RootViewController의 초기화 로직이 메인 윈도우의 nib 파일에 포함되어 있다고 가정합니다. 대부분의 UI가 다음과 같이 만들어 졌기 때문입니다. IB 맞지? – BeachRunnerFred

2

이것은 MainWindow.xib에서 응용 프로그램 대리인 개체가 File 's Owner (UIApplication)에 연결되어 있지 않기 때문에 발생합니다. MainWindow.xib를 열고 App Delegate를 마우스 오른쪽 버튼으로 클릭하여 Referencing Outlet to File 's Owner에 연결되어 있는지 확인할 수 있습니다. 그렇지 않은 경우 설정하십시오. 그리고 이것은 당신의 문제를 해결할 것입니다.

관련 문제