View Hierarchy

前言

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


    Debug View Hierarchy
Debug View Hierarchy
  • 我們?yōu)槭裁匆私釼iew Hierarchy呢? 舉一個(gè)很簡單的例子吧, 如果你解決過足夠多的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é)點(diǎn), 而下面的view之間的關(guān)系就對應(yīng)這subviews和superview的關(guān)系.
  • 此時(shí)我們點(diǎn)進(jìn)UIView的頭文件, 在下方可以找到view的類擴(kuò)展@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é)任傳遞給下一個(gè)更高級的對象,即當(dāng)前responder對象的nextResponder的時(shí)候,如果此時(shí)需要渲染window, 系統(tǒng)就會根據(jù) View Hierarchy來檢測views的layer的層次來判斷需要進(jìn)行渲染的部分,從而避免每次都重復(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!

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

聯(lián)系我

<a >github</a>

<a >微博</a>

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

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

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

  • ViewsBecause view objects are the main way your applicati...
    梁光飛閱讀 753評論 0 0
  • // //UIView.h //UIKit // //Copyright (c) 2005-2015 Apple ...
    李某lkb閱讀 1,873評論 0 0
  • 視圖和視圖層級 視圖基礎(chǔ) 視圖是 UIView 的一個(gè)實(shí)例, 或它的一個(gè)子類 視圖知道怎么繪制自己 能處理事件, ...
    焉知非魚閱讀 394評論 0 0
  • 前言 工作中,領(lǐng)導(dǎo)想看看沒有真機(jī)情況下,模擬器對應(yīng)的UI層級關(guān)系,每層的顯示情況?位置前后?怎么辦? 簡介 Deb...
    隨心吧閱讀 9,044評論 4 10
  • 一種無言的話能觸動內(nèi)心的驚恐 我來時(shí)他說的是美好 我走近他說的是嘲笑 謊言不足以傷害我 我背后的傷疤 是我年少時(shí)留...
    百度驚悚閱讀 237評論 6 12

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