前言
-
View Hierarchy: 從字面上理解就是視圖的分層.可能這樣說,你還有點迷惑.但是如果你的Xcode是version6.0以上的, 你肯定看到過或者用過下面這個玩意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看成翻轉(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://www.reibang.com/users/9723687edfb5/latest_articles">簡書</a>