2014-11-12 2 views
3

저는 루트라고 부르는 UIViewController가 있습니다 (모달 세그) 다른 UIViewController (firstChild)가 제시됩니다 (다시 모달 세그) UINavigationController (topChild)입니다.dismissViewControllerAnimated : 완료 : iOS 7과 iOS 8에서 다른 결과를 생성합니다.

[root dismissViewControllerAnimated:NO completion:^{ 
    [root performSegueWithIdentifier:@"ToNewFirstChild" sender:self]; 
}]; 

아이폰 OS 7,이 효과는 topChild가 newFirstChild에 SEGUE이 완료 될 때까지 화면에 남아 있고, newFirstChild 다음 (루트 제시)가 표시되어있다 : 최고 아이에서 나는 다음을 수행합니다. 나는 그것을 좋아한다.

iOS 8에서 topChild가 화면에서 즉시 제거되고 firstChild가 잠시 표시된 다음 제거되어 segue가 완료 될 때까지 루트가 표시되고 newFirstChild가 표시됩니다 (루트로 표시됨) . 나는 그것을 좋아하지 않는다.

dismissViewControllerAnimated:completion:에 애니메이션을 적용하면 다음과 같은 결과가 발생합니다. iOS 7에서는 topChild가 애니메이션으로 닫히고 firstChild (문서에 광고 된 내용)가 표시되지 않고 segue가 완료 될 때까지 루트가 표시됩니다. ; iOS8에서는 topChild가 화면에서 즉시 제거되어 firstChild가 생기고 애니메이션은 문서와는 달리 해제되고 다시 segue가 완료 될 때까지 루트가 표시됩니다.

iOS 8에서 iOS 7 (애니메이션 사용 여부에 관계없이)에서 생성 된 효과를 얻으려면 어떻게해야할까요? 내가 뭘 놓치고 있니?

답변

0

여기에서 다루는 문제는보기 컨트롤러의 dismissViewControllerAnimated:completion 완료 블록에서 메소드를 호출하여 사용자가 해고 (할당 해제)하고있어 산발적이고 예기치 않은 동작이 발생한다는 것입니다.

보기 컨트롤러를 닫을 때 알림을 게시하고 알림을받을 수있는 부모 (루트) 컨트롤러에서 처리기를 유지하는 것과 같은 것을 사용하는 것이 좋습니다. 루트 뷰 컨트롤러에서

이 어딘가에 전화를 (아마도 prepareForSegue에서을?) :

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(topChildWasDismissed:) 
               name:@"TopChildDismissed" 
               object:nil]; 

당신은 또한 당신의 루트 VC의 핸들러 메소드가 필요합니다에서 그런

- (void)topChildWasDismissed { 
    [self performSegueWithIdentifier:@"ToNewFirstChild" sender:self]; 
} 

당신의 최고 어린이 :

[self dismissViewControllerAnimated:YES completion:^(void) { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"TopChildDismissed" object:self]; 
}]; 
+0

감사합니다. 알림을 보내어 개선 할 수 있는지 알아 봅니다. 하지만 dismissViewControllerAnimated : completion : 수신기를 닫지 않습니다. 그것은 수신자의 자식 UIViewController - 설명서에서 "수신기에 의해 모달로 표시된 뷰 컨트롤러를 닫습니다."및 "여러 개의 뷰 컨트롤러를 연속적으로 제시하여 제시된 뷰 컨트롤러 스택을 구축하고이 메서드를 스택의 하위에있는 뷰 컨트롤러는 해당 자식 뷰 컨트롤러와 그 자식 위의 모든 뷰 컨트롤러를 스택에서 닫습니다. " – frankw

관련 문제