2009-09-25 6 views
8

인내심을 가지고 있습니다. 아직 Cocoa Touch를 배우고 있습니다. 질문을 호출하지 않는 다른 -viewDidLoad는 내 문제와 관련이 없으므로 검색을 수행했습니다.-viewDidLoad가 서브 클래 싱 된 UIViewController에서 호출되지 않았습니다.

나는 FooViewController, UIViewController 하위 클래스를가집니다. FooViewController.xib의 File 소유자는 FooViewController로 설정되어 있습니다. 또한 Main, 누구의 응용 프로그램 대리인은 MyApplication이고 파일 소유자는 UIApplication입니다. 내 기본 펜촉은 Main으로 설정됩니다.

UIWindow *main; 

-(void)applicationDidFinishLaunching:(UIApplication*)application { 
    [self showFooViewController]; 
    [main makeKeyAndVisible]; 
} 

-(void)showFooViewController { 
    fooViewController = [[FooViewController alloc] init]; 
    if(![[NSBundle mainBundle] loadNibNamed:@"FooViewController" owner:fooViewController options:nil]) { 
     DebugF(@"Failed to load FooViewController"); 
     return; 
    } 

    // Add the view and put it in place 
    UIView *view = [fooViewController view]; 
    CGRect cur = [view frame]; 
    cur.origin = CGPointMake(0.0f, 20.0f); 
    [view setFrame:cur]; 

    [main addSubview:[fooViewController view]]; 
} 

그러나,이 메시지가 FooViewController로 전송되지 않는 :

- (void) viewDidLoad { 
    DebugF(@"Hello!"); 
} 
내가보기를 만들 수 있어요

은 (간결 냈다 코드)이 흐름을 사용하여 화면에 표시

gdb의 출력에서 ​​전체 침묵.

IB의 문서보기에 인스턴스 등을 표시하는 다른 코코아 자습서를 보았지만이 옵션이 내 것으로 보이지 않습니다. Nib에서 fooViewController를 인스턴스화하기로되어 있습니까? 연결이 끊어 졌습니까? FooViewController.xib에서 File 's Owner 뷰는 Nib의 뷰에 연결됩니다.

이것은 간단한 해결책이라고 확신하며 잘못된 경로를 따라 걸어갔습니다. 하프!

답변

18

:

viewDidLoad 메소드가 불려 loadView 후 즉시 호출 할 것으로 예상, 그것은 누구에게나에게 달려있다

loadView으로 전화하여 viewDidLoad에 추가 통화를하십시오.

경우에 따라 SDK가이 동작을 처리합니다. 서브 클래스가 UIViewController이고 MyViewController이라고 가정합니다. 다음 :

  • 당신이 myViewController.view에 액세스하는 경우

    당신은 슈퍼 클래스의 접근은 그 후 즉시 당신을 위해 loadViewviewDidLoad를 호출 똑똑, loadView를 호출하기 전에. 코드는 다음과 같습니다 경우 결과

:

MyViewController *myViewController = [[MyViewController alloc] init]; 
[superView addSubview:myViewController.view]; // Calls viewDidLoad. 

는 다음 두 loadViewviewDidLoad은 귀하를 대신 호출됩니다.코드는 다음과 같습니다 경우

그러나 :

MyViewController *myViewController = [[MyViewController alloc] init]; 
[myViewController loadView]; 
[superView addSubview:myViewController.view]; // Doesn't call viewDidLoad. 

다음 view 게터는 이미 뷰를로드 한 볼 수 있습니다, 그리고 당신은 또한뿐만 아니라 viewDidLoad라고 가정 - 그래서 호출하지 않습니다 어느 한 쪽. 역설적이게도 여기서 추가 함수 호출은 viewDidLoad이 호출되는 것을 방지합니다.

+4

설명서에 따르면 "이 메서드는 [loadView]를 직접 호출하면 안됩니다." –

+0

고마워요, 피터 - 당신이 말하는 것을 봅니다. 누구나 Apple의 원본 소스를 읽고 싶다면 다음 링크를 참조하십시오. http://developer.apple.com/iphone/library/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#// – Tyler

+0

나는 정확히 같은 문제 (직접'loadView'를 호출했다), 정보를 주셔서 감사합니다. –

3

나는 내 자신의 질문에 답해 왔기 때문에 미래의 사람들에게 도움이 될 것입니다. viewDidLoad는 "viewDidLoad가 호출되지 않음", "viewDidLoad가 호출되지 않음"및 "viewDidLoad가 실행되지 않음"이라는 내 제안의 세 가지 상위 Googles를 볼 수 있기 때문에 일반적인 실수라고 생각합니다.

변경 :

fooViewController = [[FooViewController alloc] init]; 
if(![[NSBundle mainBundle] loadNibNamed:@"FooViewController" owner:fooViewController options:nil]) { 
    DebugF(@"Failed to load FooViewController"); 
    return; 
} 

사람 :

fooViewController = [[FooViewController alloc] initWithNibName:@"FooViewController" bundle:[NSBundle mainBundle]]; 

문제를 해결했습니다. 내가 코코아를 어떻게 사용하고 있는지 분명히 실수.

나는 다음을 백업하는 문서를 발견하지 않았습니다, 그러나 이것은 내가 실험/경험에 의해 추론 한 것입니다
+1

작은 것이지만 번들에 nil을 전달하면 기본 번들이 보일 것입니다. –

+0

불행히도 후자의 호출은 옵션을 지정할 수 없게 만듭니다. 즉, 프록시 객체를 사용할 수 없습니다. 하지만 난 그냥 viewDidLoad 무시하고 내 자신의 메서드를 수동으로 호출해야 할 것 같습니다. –

4

동일한 문제가 두 번있었습니다. 처음에는 UITableViewController 뷰를 인터페이스 빌더의 실제 UITableView에 연결하는 것을 잊었다. 두 번째로, 나는 awakeFromNib을 슈퍼 클래스에서 호출하는 것을 잊었다.