View Hierarchy

前言

  • View Hierarchy: 從字面上理解就是視圖的分層.可能這樣說,你還有點迷惑.但是如果你的Xcode是version6.0以上的, 你肯定看到過或者用過下面這個玩意Debug View Hierarchy:


    Debug View Hierarchy
Debug View Hierarchy
  • 我們?yōu)槭裁匆私釼iew Hierarchy呢? 舉一個很簡單的例子吧, 如果你解決過足夠多的bug或者踩過很多的坑,那你一定遇到過ios attempt to present whose view is not in the window hierarchy或者Warning: Attempt to present on whose view is not in the window hierarchy!

View Hierarchy詳解

  • 這是我在網(wǎng)上找的一張圖, 比較直觀
View Hierarchy
  • 如上圖所示, 可以把View Hierarchy看成翻轉(zhuǎn)的樹結(jié)構(gòu), 而window就是樹的根節(jié)點, 而下面的view之間的關(guān)系就對應(yīng)這subviews和superview的關(guān)系.
  • 此時我們點進UIView的頭文件, 在下方可以找到view的類擴展@interface UIView(UIViewHierarchy),我們就可以根據(jù)上圖理出View Hierarchy中的view的三種屬性定義關(guān)系
    • superview, view的父視圖
    • subviews, view的子視圖集合
    • window, 包含view的container
@property(nullable, nonatomic,readonly) UIView       *superview;
@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;
@property(nullable, nonatomic,readonly) UIWindow     *window;
  • View Hierarchy還是Responder Chain的非常重要的部分, 當(dāng)Responder Chain通過responder對象將處理事件的責(zé)任傳遞給下一個更高級的對象,即當(dāng)前responder對象的nextResponder的時候,如果此時需要渲染window, 系統(tǒng)就會根據(jù) View Hierarchy來檢測views的layer的層次來判斷需要進行渲染的部分,從而避免每次都重復(fù)渲染同一部分.

ios attempt to present whose view is not in the window hierarchy和Warning: Attempt to present on whose view is not in the window hierarchy!

  • 我舉一個前段時間, 我身邊的一個朋友犯的一個錯誤吧作為例子吧.當(dāng)接收到遠程推送的時候的時候, 在AppDelegate.m中用之前定義好的一個UIViewController直接present到目標(biāo)控制器, 然后再目標(biāo)控制器取出UIWindow的rootViewController進行present.然后就報了上面的錯.
  • 這種錯誤可以用一個通俗易懂的例子: 空中閣樓.在沒有地基,沒有第一層/第二層的情況下, 直接妄圖搭建第三層樓.
  • 解決方法: 如果是類似我舉的例子的情況, 可以直接使用當(dāng)前的控制器進行present, 或者在控制器的viewDidAppear中去present.

聯(lián)系我

<a >github</a>

<a >微博</a>

<a href="http://m.itdecent.cn/users/9723687edfb5/latest_articles">簡書</a>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容