2012-03-07 2 views
2

iPad 5.0 이상한 충돌에 문제가 있습니다. 이 충돌은 iOS 5.0 및 모달 ViewController가있는 iPad에서만 발생하며 ViewControler 스타일은 정상적으로 작동하는 전체 화면 이외의 다른 것으로 설정됩니다.유튜브 비디오 모달 ViewController, 이상한 충돌 'UIViewControllerHierarchyInconsistency'

코드 예제가 포함되어 있습니다. 그것을 실행하고 페이지 시트 버튼을 누르면 윈도우에 UIWebView와 Youtube 비디오가 나타납니다. 비디오가 시작되면 "전체 화면"을 눌러 버킷을 트리거하십시오. iOS 5만이 iOS 4.x에서 작동합니다.

전체 화면 버튼을 누르면 모달 UIViewController에 전체 화면 스타일이 사용되고 비디오 만 제대로 재생됩니다.

해결 방법이나 더 나은 해결책을 알고있는 사람이 있습니까? "부모 뷰 컨트롤러가 있어야합니다"0x85d5e00 : UIViewController에가 "아이 뷰 컨트롤러 :"

인해 캐치되지 않는 예외 "UIViewControllerHierarchyInconsistency"이유는 응용 프로그램 종료 NewsTableViewController : 0x855f7b0 "을하지만 요청 부모는"MPInlineVideoViewController : 0x85d3a20 "

소스 코드 (드롭 박스)는 http://db.tt/xqMbeYP1

+2

왜 이런 일이 발생하는지 정확히 알 수는 없지만 모달 컨트롤러를 누르는 대신 사용자 지정보기에 애니메이션을 적용하여 문제를 해결할 수 있습니다. – tipycalFlow

+0

tipycalFlow가 맞습니다. 이것은'UIWebView'의 버그입니다. 그래서 우리는 지금 당장이 문제를 해결해야합니다. 바보 같은 애플은'UIWebView'을 수정하지 않았습니다. – Hyperbole

답변

9

이는있는 UIWebView의 일부에 오류가 아닙니다. 애플이 마침내 방식으로 엄격한 된 것이 었습니다 무슨 일이

하는 것이 주에서 애플리케이션의 뷰 계층 구조를 이해합니다. iOS 5.x 이전에는 개발자가 한 계층에서보기를 제거하고 다른 계층에 추가 할 수있었습니다. 이것의 완벽한 예는 응용 프로그램의 기본 뷰 계층 구조입니다. 모달 뷰 컨트롤러를 제공 할 때이 모달 뷰 컨트롤러에는 응용 프로그램의 뷰 계층 구조의 일부가 아닌 자체 뷰 계층 구조가 있습니다. 따라서 모달 뷰 컨트롤러에 하위 뷰가 있고 그 뷰 내에 동영상 (보기로도 발생합니다)이 있고이 동영상을 최대화해야한다면 해당 동영상의보기가 모달보기 컨트롤러의 계층 구조에서 제거되고 ... 응용 프로그램의 뷰 계층 구조에 추가

application            modal view controller 
    |                | 
    |                | 
window               view 
    |                | 
    |                | 
    |----------------         ------------------ 
    |    |         |    | 
    |    |         |    | 
subview 1  subview 2        subview 3   movie 

바와 같이, 모달 뷰 컨트롤러의 뷰 계층 응용 프로그램의 뷰 계층 구조의 밖에 볼 수 있습니다 ,이 문제는 아이폰 OS 5.x를 이전하지 않았다 때 때문에 모달보기 컨트롤러가 제공되었고 영화가 최대화되었습니다. Apple이 한 일은 다음과 같습니다 :

application            modal view controller 
    |                | 
    |                | 
window               view 
    |                | 
    |                | 
    |-------------------------       ------------ 
    |   |    |       | 
    |   |    |       | 
    movie subview 1  subview 2     subview 3 

With 영화는 다른 모든 시각 위에 나타납니다. 이것은 더 이상 iOS 5.x +의 경우가 아닙니다. 오류를 범하면 오류가 발생하고 이전에 인사를했던 오류가 표시됩니다.

이 문제를 해결하려면보기 컨트롤러를 모달보기 컨트롤러로 표시하지 않고 응용 프로그램의보기 컨트롤러보기를 추가하여 모달보기 컨트롤러의보기를 응용 프로그램의보기 계층 구조로 만들어야합니다 계층 구조는 다음과 같이

이 시점에서
              application 
                   | 
                   | 
modal view controller          window 
      |             | 
      |             | 
      --------------------------------------------------------------- 
      |          |      | 
      |          |      | 
     view         subview 1   subview 2 
      | 
      | 
    ------------------- 
    |     | 
    |     | 
subview 3   movie 

는, 모든 사람들이 필요로 정말 처음, 방법을 적절하게 구조 뷰 계층 구조와 그들이 어떻게 그 많은 내 미래의 확장 성뿐만 아니라, 서로 상호 작용에서, 생각 프로젝트.

이 문제는 2011 년 WWDC에서 Apple에 의해 잘 문서화되었습니다. 세션 102에서 논의됩니다.

+2

잠시만 기다려주세요 ... 사과의 잘못은 어때? UIWebview는 사파리와 마찬가지로 모달 뷰를 표시하는 코드입니다. 임베디드 비디오는 웹 전체에 걸쳐 있으며, SDK를 사용하는 1/2 수백만 개의 앱이 있으며 하위 호환성을 없애기로 결정했습니다. 나는 이것이 애플과 관련된 버그라고 말한다. 동의했다. 새로운 뷰 계층 구조는 많은 사람들이 해킹 한 것을 해독한다. 그러나 이것은 해킹이 아니다. – bandejapaisa

+0

이것은 왜 발생하고 해결책을 설명하는 좋은 대답입니다. 그러나 iOS 6+에서 이슈를 수정 한 이후 애플 버그가 아니라고 주장하는 것은 잘못되었을 수 있습니다. 어떻게 작동합니까? – Accatyyc

0

같은 문제가있었습니다. 문제는 모달이 뷰 컨트롤러의 자식으로 추가되지 않는다는 것입니다. UIKit 버그 인 것처럼 보입니다. 우리의 해결 방법은 동일하게 보인 가짜 모달을 만드는 것이 었습니다. 몇 시간 걸렸지 만 트릭을 했어.

+0

나는 똑같은 짓을했다. – Konrad77

0

YouTube가 전체 화면으로 전환 될 때 앱을 종료하는 데 문제가있었습니다. 나는 플레이어, 깨끗한 제거 superviews에서 일부보기 등을 중지하는 몇 가지 코드를 한 곳

그것은

내가 이동하여 해결 한 .. 전체 화면 모드로 전환하면있는 UIWebView의의 ViewController의 "viewWillDisappear"를 부르는 밝혀졌다 "viewWillDisappear"코드 (유튜브 종료)에 "didMoveToParentViewController"

- (void)didMoveToParentViewController:(UIViewController *)parent { 
    // parent is nil if this view controller was removed 
    if (parent == nil) { 
     [self closeModal]; // this is moved from viewWillDisappear - it is only called when "Back" button of navigationcontroller's item is clicked. 
    } 
} 

나는이 사람을 도움이되기를 바랍니다.