2

저는 삽입 광고의 표시 여부를 웹 서비스에 쿼리하는보기 컨트롤러가 있습니다. 그렇다면 presentViewController : animated : completion :을 사용하여 또 다른보기 컨트롤러가 인스턴스화되고 표시됩니다. this answerdocs에 따르면 viewDidAppear : 제공된 뷰 컨트롤러를 해제 할 때 호출되지 않을 것이라고 가정합니다 (자체적으로 수행합니다). 개념적으로 나에게도 어쨌든 프리젠 테이션 뷰 컨트롤러의 뷰는 뷰 계층 구조에서 제거되지 않으므로 "다시 표시"할 필요가 없습니다. 나는 틀렸어. 그래서 무슨 일이 일어나고있는거야? 왜 내가 본 문서가 말하는 것과 다른 것입니까?viewDidAppear : presentViewController를 사용할 때 호출됩니다. 애니메이션 : 완료 :

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    [[AdService sharedAdService] adForSlotName:@"Main Interstitial" completionBlock:^(Ad *adForSlotName) { 

     if(adForSlotName) 
     { 
      InterstitialAdViewController_iPhone *interstitialAdViewController = [[InterstitialAdViewController_iPhone alloc] init]; 
      interstitialAdViewController.ad = adForSlotName; 

      dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
      dispatch_async(mainQueue, ^{ 

       [self presentViewController:interstitialAdViewController animated:YES completion:^{}]; 

      }); 

      [interstitialAdViewController release]; 
     } 
    }]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [[AdService sharedAdService] clearAdForSlotName:@"Main Interstitial"]; 

    [super viewWillDisappear:animated]; 
} 
+0

어떤 시점에서 viewDidAppear을 수신중인보기는 어느 것입니까? 내게 그것은 당신의 질문에 불분명하게 보인다. viewDidAppear은 뷰가 나타날 때마다 호출된다고 가정합니다. 출현은 일단 뷰가 제시되면 일어날 수 있지만 이전에 뷰를 덮은 뷰가 제거 (해고)되면 기본 뷰에서도 발생합니다. – Till

+0

사과, viewDidAppear : 현재보기 컨트롤러에서 표시 컨트롤러가 해제 될 때마다 호출됩니다. – rob5408

+0

은 내 첫 번째 의견의 두 번째 부분에서 초안을 작성한 것으로 내 예상과 일치하며 정확히 있어야합니다. – Till

답변

5

당신이 링크 한 대답은 viewDidDisAppear가 아니라 viewDidDisAppear의 동작입니다. 링크 된 문서의 참고 사항에 따르면 팝업 뷰이 표시된 하위 뷰 컨트롤러 이 닫히면 해당 뷰 컨트롤러에서 viewDidAppear가 호출되지 않습니다.

당신의 경우에는 popover없이 하위보기 컨트롤러를 제공하므로보기의 컨트롤러에서 viewDidAppear이 호출되어야한다고 말하는 것과 같이 문서의 메모를 읽습니다. 자녀보기 컨트롤러가 귀하의 경우 해산됩니다.

하위보기 컨트롤러가 제공 될 때 viewDidDisappear가 부모보기 컨트롤러에서 호출되는 것을 확인해야한다고 생각합니다. 상위 및 하위 클래스 모두에서 다양한 모양 관련 콜백에 대한 호출을 기록,

Parent *parent = [[Parent alloc] initWithNibName:nil bundle:nil]; 
[self.window setRootViewController:parent]; 
double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    Child *child = [[Child alloc] initWithNibName:nil bundle:nil]; 
    [parent presentViewController:child animated:YES completion:^{ 
     NSLog(@"Child presented"); 
     double delayInSeconds = 2.0; 
     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
      [parent dismissViewControllerAnimated:YES completion:^{ 
       NSLog(@"Child dismissed"); 
      }]; 
     }); 
    }]; 
}); 

과 : 나는 아이 뷰 컨트롤러를 제공하기 위해이 코드를 사용하여, 최소한의 테스트 애플 리케이션이를 시도했다.

부모 뷰 컨트롤러에게 루트 뷰 컨트롤러 만들기 :

: 아이 뷰 컨트롤러 일축

Parent viewWillDisappear: 
Child viewWillAppear: 
Child viewDidAppear: 
Parent viewDidDisappear: 
Child presented 

: 아이 뷰 컨트롤러를 제시

Parent viewWillAppear: 
Parent viewDidAppear: 

를이 내가 보는 순서입니다

Child viewWillDisappear: 
Parent viewWillAppear: 
Parent viewDidAppear: 
Child viewDidDisappear: 
Child dismissed 

내 생각에 내부적으로 일관성이있는 것 같습니다. 부모는 di sappearance는 자식 뷰 컨트롤러가 표시 될 때 호출되며 자식 뷰 컨트롤러가 닫힐 때 모양이 호출됩니다. 그리고 이것은 하위 뷰 컨트롤러에 팝 오버가 나타나지 않기 때문에 viewWillAppear의 문서화 된 동작과 여전히 일치합니다.

자식보기 컨트롤러가 표시 될 때 왜 당신이 viewWill/DidDisappear 호출을받지 못하는지 알 수 없습니다.

+0

사실 내 문제는 viewWillDisappear에서 시작되었습니다.보기 컨트롤러를 표시 할 때 호출되지만 어쩌면 다른 상황의 증상 일 가능성이 높습니다. 그래서 나는 내 견해의 관점에서 질문을 구성했다. 어쩌면 전체 질문을 다시 써야합니다. 감사. – rob5408

+0

안녕하세요 애론, 한 번 더 덧글. 내게는 예상 된 동작이 뷰 컨트롤러를 표시 할 때 viewDidDisappear를 호출하지 않는다면 이상하게 보입니다. 원래 뷰 컨트롤러는 제공된 뷰 컨트롤러를 닫을 때 viewWillAppear을 호출하지 않아야합니다. 동의하니? – rob5408

+0

나는 그것이 이상하게 보인 사실에 동의하고, 실제로 이것을 실험 해 보았을 때 viewDidDisappear가 자식 뷰 컨트롤러를 표현할 것을 요구한다. (나의 편집 참조). –

3

나는 동일한 행동을 경험했다. 제공된 뷰 컨트롤러를 닫을 때 viewDidAppear: 메서드가 호출됩니다. 그러나 탈출구가 있습니다. 컨트롤러 내부에 부울 변수를 만들고 NOviewDidLoad으로 설정하고 viewDidAppear:에서 확인하십시오. 그런 다음 YES으로 설정하십시오. 좋아요 :

#import "MyViewController.h" 

@implementation MyViewController { 
    BOOL alreadyShown; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    alreadyShown = NO; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    if (!alreadyShown) { 
     alreadyShown = YES; 
     //do your stuff 
    } 
} 

@end 
+0

감사합니다. Adam, 저는이 방법을 사용하여 제가 찾고있는 것을 얻을 것입니다. – rob5408