2012-03-07 39 views
2

我有一個iPad 5.0上的奇怪崩潰的問題。 這次崩潰只發生在iOS 5.0和iPad上,並帶有模式ViewController,ViewControler風格設置爲除全屏之外的任何其他功能,這很好。YOUTUBE視頻內部模態ViewController,奇怪的崩潰'UIViewControllerHierarchyInconsistency'

我包括一個代碼示例。如果你運行它並按下頁面按鈕,一個窗口將出現一個UIWebView和一個Youtube視頻。一旦視頻開始,按「全屏」觸發bugg。 (只有iOS 5,它將在iOS 4.x中運行)。

如果你按全屏按鈕,唯一的區別是我使用全屏風格的模式UIViewController和視頻播放就好了。

有沒有人知道工作或更好的解決方案?

終止應用程序由於未捕獲的異常 「UIViewControllerHierarchyInconsistency」 的原因: 「子視圖控制器 」的UIViewController:0x85d5e00「 應該有父視圖控制器:」 NewsTableViewController:0x855f7b0" ,但要求家長是: 「MPInlineVideoViewController:0x85d3a20」

的源代碼(Dropbox的)http://db.tt/xqMbeYP1

+2

我不知道爲什麼發生這種情況,但可以通過動畫自定義視圖而不是推送模式控制器來解決此問題。 – tipycalFlow 2012-03-07 15:42:23

+0

tipycalFlow是正確的。這是'UIWebView'中的一個錯誤,所以我們現在必須解決它。愚蠢的蘋果沒有修復'UIWebView'。 – Hyperbole 2012-03-08 19:04:16

回答

9

這是不是一個錯誤的UIWebView中的一部分。

實際情況是,蘋果終於成了爲嚴格的方式在其主保留了應用程序的視圖層次結構。在iOS 5.x之前,開發人員能夠從一個層次結構中刪除視圖並將其添加到另一個層次結構中。這就是完美的例子,應用程序的主視圖層次結構;當呈現一個模態視圖控制器時,這個模式視圖控制器有它自己的視圖層次結構,它不是應用程序視圖層次結構的一部分;因此,如果模式視圖控制器有一個子視圖,並且在該視圖中它已經說了一部電影(這恰好也是一個視圖)並且該電影被最大化,則電影的視圖將從模式視圖控制器的層次結構中移除並且添加到應用程序的視圖層次...

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

可以看出,模態視圖控制器的視圖層次位於應用程序的視圖層次結構之外,在此之前是不是有問題到iOS 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上有很好的記錄。在會議102中討論。

+2

稍等片刻......這不是蘋果的故障嗎? UIWebview是他們的代碼,就像Safari一樣呈現模態視圖。嵌入式視頻遍佈網絡,使用SDK的用戶有2千萬個,他們決定不向後兼容?我會說這是Apple的一個錯誤。同意,新的視圖層次打破了許多人們正在做的黑客攻擊 - 但這不是黑客行爲。 – bandejapaisa 2012-05-20 19:29:16

+0

這是一個很好的答案,它解釋了爲什麼會發生以及解決方案。但聲稱這不是蘋果的錯誤可能是錯誤的,因爲他們在iOS 6+中解決了這個問題。它在那裏如何工作? – Accatyyc 2013-06-10 11:12:46

0

我有同樣的問題。問題在於模式不會作爲呈現它的視圖控制器的子項添加。看起來是一個UIKit錯誤。我們的解決方法是製作一個看起來完全相同的仿人模式。花了幾個小時,但伎倆。

+0

我做了同樣的事情。 – Konrad77 2012-05-21 07:25:25

0

我有一個問題,當youtube進入全屏時崩潰的應用程序。

原來,進入全屏模式稱之爲「viewWillDisappear」在一個UIWebView的視圖控制器,我有一些代碼,停止播放器,清潔remove從superviews一些看法,等等。

我已經通過移動解決它「viewWillDisappear」 代碼(關閉YouTube)的,以 「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. 
    } 
} 

我希望這可以幫助別人。