2012-03-07 11 views
2

iPad 5.0で異常なクラッシュに問題があります。 このクラッシュは、iOS 5.0およびiPadのモーダルViewControllerでのみ発生し、そのViewControlerスタイルはフルスクリーン以外のものに設定されていますが、正常に動作します。YoutubeビデオのモーダルViewController、奇妙なクラッシュ 'UIViewControllerHierarchyInconsistency'

コード例が含まれています。それを実行してPagesheetボタンを押すと、ウインドウにUIWebViewとYoutubeビデオが表示されます。ビデオが開始したら、「フルスクリーン」を押してバグをトリガーします。 (iOS 5のみ、iOS 4.xでも動作します)。

フルスクリーンボタンを押すと、唯一の違いは、モーダルUIViewControllerにフルスクリーンスタイルを使用していることと、ビデオがうまく再生されることだけです。

解決方法はありますか? "親ビューコントローラを持っている必要があります: "0x85d5e00:のUIViewControllerは:" 子ビューコントローラ:"

キャッチされない例外により "UIViewControllerHierarchyInconsistency" 理由にアプリを終了NewsTableViewController:0x855f7b0" をするだけで、要求された親は: "MPInlineVideoViewController:0x85d3a20"

ソースコード(Dropboxが)http://db.tt/xqMbeYP1

+2

なぜこのようなことが起こるのかわかりませんが、モーダルコントローラーを押すのではなく、カスタム表示をアニメーションすることで回避できます。 – tipycalFlow

+0

tipycalFlowが正しいです。これは 'UIWebView'のバグですので、今のところ回避しなければなりません。愚かなAppleは 'UIWebView'を修正していません。 – Hyperbole

答えて

9

これはのUIWebViewの一部のエラーではありません。

何が起こったAppleはついに、それが主な方法にとして厳格になったということでしたアプリケーションのビュー階層が損なわれます。 iOS 5.x以前は、ある階層からビューを削除して別の階層に追加することができました。これの完璧な例は、アプリケーションのメインビュー階層です。モーダルビューコントローラを提示するとき、このモーダルビューコントローラは、アプリケーションのビュー階層の一部ではない独自のビュー階層を有する。したがって、モーダルビューコントローラにサブビューがあり、そのビュー内にムービー(ビューも同様に発生する)があり、このムービーを最大化すると、ムービーのビューはモーダルビューコントローラの階層から削除され、アプリケーションのビュー階層に追加さ...

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

として、なぜならとき、これは前のiOS 5.xのに問題はなかった、モーダルView Controllerのビュー階層は、アプリケーションのビュー階層の外側にある、見られるかもしれませんモーダル・ビュー・コントローラーが発表され、映画は最大化されました。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は、Safariと同様に、モーダルビューを提示しているようなコードです。埋め込みビデオはウェブ上にあり、SDKを使用しているアプリは1/2百万個あり、後方互換性を持たないものにすることに決めましたか?私はそれがアップルのバグだと言います。合意した、新しいビュー階層は、人々がやっていたたくさんのハックを壊しますが、これはハックではありませんでした。 – bandejapaisa

+0

これは、それが起こる理由と解決方法を説明する良い答えです。しかし、Appleのバグではないと主張するのは、iOS 6以降で問題を修正してから間違っている可能性があります。どうやってそこで動くの? – Accatyyc

0

私は同じ問題を抱えていました。問題は、モーダルがそれを提示しているビューコントローラの子として追加されていないことです。 UIKitバグのように見えます。私たちの回避策は、同じように見える擬似モーダルを作ることでした。数時間かかったが、そのトリックをやった。

+0

私は同じことをしました。 – Konrad77

0

YouTubeがフルスクリーンになったときにアプリがクラッシュする問題が発生しました。

それは私が移動することによってそれを解決した

...フルスクリーンモードを入力すると、私はプレーヤーを停止するいくつかのコードを持っていたのUIWebViewののViewControllerの「viewWillDisappear」を呼び出して、クリーンなど、superviewsからいくつかのビューを削除することが判明"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. 
    } 
} 

私はこれが誰かに役立ちます願っています。

関連する問題