1

다음과 같은 이유와 해결 방법을 이해하는 데 어려움이 있습니다.uisplitviewcontroller와 함께 사용되는 모달 뷰를 닫은 후 문제가 발생했습니다.

분할보기 기반 응용 프로그램을 사용하여 응용 프로그램을 만들었습니다. 기본 루트 컨트롤러의 바닥 (의 좌측에 표시됩니다,

- (IBAction)showTheModal:(id)sender { 
theModalController.modalPresentationStyle = UIModalPresentationFullScreen; 
theModalController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
[self presentModalViewController:theModalController animated:YES]; 

if ([detailViewController popoverController] != nil) 
    [[detailViewController popoverController] dismissPopoverAnimated:YES]; 

과정의 BarButtonItem :

은 내가 UiBarButtonItem가 RootViewController.m에서 발견이 메소드를 호출하는 showTheModal라는 추가 한 조경에있는 쪼개지는 전망) 또는 팝업의 바닥에 (조경에서 경우에).

모달보기는 도구 모음에있는 단추로 닫힙니다. 그것은 다음을 호출합니다 :

[self dismissModalViewControllerAnimated: YES]; 

모달이 작동하는 동안 나는 화면을 회전시키는 것이 문제입니다. 다음은 서로 다른 시나리오에서 발생하는 상황입니다 (시작은 showTheModal 버튼이 눌린 방향, 끝은 dismissModal 버튼을 누를 때의 방향을 나타냄).

1) 풍경 시작, 끝 풍경 : 모든 것이 잘 보입니다. willHideViewController 및 willShowViewController 메서드가 RootViewController에서 호출되지 않습니다. (예상대로)

2) 가로 시작, 끝 세로 : UI가 정상적으로 나타납니다. willHideViewController가 두 번 실행됩니다 (이유는 무엇입니까?)

3) 시작 세로, 끝 세로 : UI가 정상적으로 나타납니다. willHideViewController가 한 번 실행됩니다 (예상대로)

4) 세로보기 시작, 가로보기 : '루트 목록'버튼이 세부보기 (분할보기의 오른쪽)에 남아 있습니다. willHideViewController 및 willShowViewController가 호출되지 않습니다 (WHY ??) 에 관해서는

어떤 생각이 왜 # 2, # 4, 진단을 위해

답변

0

? 확실히 예상되는 방식으로 동작하지 않는 먼저 팝 오버보기를 기각 봤어? 또는 (id) sender를 인쇄하여 메소드를 호출 로깅?

1

정확히 같은 문제 (위 4 번)가 있습니다. 그 주위에 viewDidAppear:animated을 사용하고보기의 높이를 확인하여 그것이 가로 방향인지 세로 방향인지 확인하십시오. (Yuck, gag, etc.) 나는 그 "해결책"에 전혀 만족하지 않는다.

아마도 관련이 있습니다. 가로 모드로 돌아간 후 세로 모드의 버튼이 사라지는 속도가 느껴졌습니다. 즉, 회전이 끝난 후 버튼이 1 초 동안 표시됩니다. 그러나 Mail.app에서 회전이 시작되면 "받은 편지함"단추가 사라집니다. Apple은 자신의 문서에서 권장하는 것보다 다르게 작업합니까? 아마도 마스터보기 단추를 표시하거나 숨기는 더 효율적인 방법이 있습니까?

0

저는 이것이 Apple Development에보고해야하는 버그라고 생각합니다.

UIModalPresentationPageSheet 형식을 사용하여 모달보기를 제공함으로써이 문제의 일부를 해결했습니다.

0

동일한 문제가 발생했습니다.

(2)에 대한 답으로 버그 인 것 같습니다.모달 뷰가 splitview 위로 푸시 될 때 방향 메시지가 모서리에 대기하고 모달 뷰가 닫히고 splitview가 표시 될 때까지 처리되지 않지만 한 콜백 만 얻을 것으로 예상됩니다.

(4)에 대해서도 버그가있는 것으로 보입니다.

다음
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 

    //Work around a bug where UISplitViewController does not send 
    //willShowViewController after a modal is presented in portrait 
    //but dismissed in landscape. 
    UIInterfaceOrientation orientation = self.interfaceOrientation; 
    if ((orientation == UIInterfaceOrientationLandscapeLeft) 
     || (orientation == UIInterfaceOrientationLandscapeRight)) 
    { 
     UINavigationItem* item = [detail.navigationBar.items objectAtIndex:0]; 
     UIBarButtonItem* barButtonItem = [item leftBarButtonItem]; 
     [super.delegate splitViewController:self willShowViewController:master invalidatingBarButtonItem:barButtonItem]; 
    } 
} 

, "마스터"마스터를 말한다 함께 IBOutlet입니다 : 다행히도, didRotate ... 이벤트가 여전히 통과, 그래서 내 솔루션은 UISplitViewController의 하위 클래스를 명시 적으로이 경우 대리인의 willShowViewController 메서드를 호출했다 splitview의 뷰 컨트롤러 (왼쪽)와 "디테일"은 디테일 뷰 컨트롤러 (오른손 크기)의 IBOutlet입니다.

제 경우에는 상세 뷰가 UINavigationController입니다. 뷰 컨트롤러에서 barButtonItem을 가져 오기 위해 다른 코드가 필요할 수 있습니다.

또한 이것은 정상 회전을 위해 willShowViewController를 두 번 호출하는 부작용이 있지만 내 경우에는 문제가되지 않습니다.

1

불행히도 이것은 버그가 아닙니다. 그것은 예상 된 행동으로 보인다. 에서 iOS 5에서

회전 콜백이 가 전체 화면을 통해 제공됩니다 컨트롤러를 볼 수 적용되지 않습니다

나는 "참고 사항 및 알려진 문제"섹션에서 아이폰 OS 5.0 아이폰 OS 릴리스 노트에서 이것을 발견했다. 이것이 의미하는 바는 코드 이 다른보기 컨트롤러를 통해보기 컨트롤러를 제시 한 후 사용자가 해고시 장치를 다른 방향으로 회전하면 기본 컨트롤러 (예 : 컨트롤러 표시)가 회전을받지 못하게됩니다. 콜백. 그러나 제시된 컨트롤러는 이 다시 표시 될 때 viewWillLayoutSubviews 호출을 수신하며 interfaceOrientation 속성은 에서 쿼리하여 컨트롤러를 올바르게 레이아웃하는 데 사용됩니다.

관련 문제