2017-03-21 12 views
0

다른보기 컨트롤러보다 모달로 표시된보기 컨트롤러가 있습니다. viewDidAppear에서 animated:NO으로 표시되면 두 번째로 표시되는 내용이 표시되지 않습니다. 저는이 문제를 다음과 같이 요약했습니다 : 스토리 보드에 단편으로 연결된 두 개의 컨트롤러를 추가했습니다. 각 컨트롤러는 viewDidAppear에 동일한 팝 오버 컨트롤러를 제공합니다. 그들 각각의 은 동일한 클래스의 인스턴스 :모달 popover 컨트롤러는 viewDidAppear에서 표시 할 때 내용을 표시하지 않습니다.

#import "ViewController.h" 
#import "PopupViewController.h" 

@interface ViewController() <UIPopoverPresentationControllerDelegate> 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

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

-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection { 
    return UIModalPresentationNone; 
} 

- (void)showPopover { 
    PopupViewController* popoverController = [[PopupViewController alloc] initWithNibName:NSStringFromClass([PopupViewController class]) bundle:nil]; 
    popoverController.modalPresentationStyle = UIModalPresentationPopover; 
    popoverController.preferredContentSize = CGRectInset(self.view.bounds, 20, 100).size; 
    popoverController.popoverPresentationController.sourceView = self.view; 
    popoverController.popoverPresentationController.sourceRect = CGRectMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds), 0, 0); 
    popoverController.popoverPresentationController.permittedArrowDirections = 0; 
    popoverController.popoverPresentationController.delegate = self; 
    [self presentViewController:popoverController animated:NO completion:nil]; 
} 

@end 

팝 오버가 앱 시작에 제대로 제시하지만, 버튼을 다시 눌러에 두 번째보기 컨트롤러를 밀어에 비어 있습니다. animatedYES으로 변경하면 popovers가 올바르게 표시됩니다.

편집 :

View hierarchy

이 그것 (장치에서 같은 올바른 팝 오버를 보는 방법이다 : 나는 엑스 코드에서 뷰 계층 구조를 디버깅 할 경우 그들이해야대로보기는 모든 프레임에 올바르게 표시됩니다 왼쪽은 공백이고 오른쪽은 비어 있음) : Example

+0

'viewDidDisappear'에서 두 번째보기 컨트롤러를 누르면 Popover가 제거됩니까? – dmorrow

+0

두 번째보기 컨트롤러로 가기 전에 그림자 주위를 두드려 팝 오버를 닫습니다. – pckill

+0

첫 번째 팝업이 사라질 때까지 기다리고 계십니까? 콘솔의 경고? – Sulthan

답변

1

이 문제는 쉽게 재현 할 수 있습니다. 이벤트 로깅을 시작했는데 이것은 UINavigationController이 애니메이션을 처리하는 방식으로 인해 발생합니다.

푸시 된 컨트롤러에 viewDidAppear이 호출되면 애니메이션이 아직 완료되지 않았습니다. navigationController:didShowViewController 방법을 UINavigationControllerDelegate에서 확인하여 직접 확인할 수 있습니다.

이벤트 로그는 다음과 같다 : 제 2 제어부는 심지어 완전히 viewDidAppear:에서 상위로 이동하지

Navigation controller will show VC 1 
VC 1 did layout subviews 
VC 1 did layout subviews 
VC 0 did move to parent <UINavigationController: 0x7feaf181ec00> 
VC 1 did appear 
VC 1 did move to parent <UINavigationController: 0x7feaf181ec00> 
Navigation controller did show VC 1 

참고있다.

내가 찾은 유일한 실행 가능한 해결 방법은 다음과 같습니다 탐색 컨트롤러 내부 작업을 완료하게됩니다

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

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self showPopover]; 
    }); 
} 

.

애니메이션없이 푸시 할 때 문제가 나타나지 않으므로 다른 애니메이션 완성 블록에서 애니메이션이없는보기 컨트롤러를 표시하려고하므로 뷰 컨트롤러 계층 구조 이벤트의 순서가 깨졌습니다 . dispatch_async을 추가하면 코드가 완료 블록에서 이동하고 모든 것이 제대로 작동하기 시작합니다.

+0

고마워, 문제가 해결 된 것 같습니다. – pckill