View Hierarchy

作者: Monkey_ALin | 来源:发表于2016-03-17 15:37 被阅读486次

    前言

    • View Hierarchy: 从字面上理解就是视图的分层.可能这样说,你还有点迷惑.但是如果你的Xcode是version6.0以上的, 你肯定看到过或者用过下面这个玩意Debug View Hierarchy:


      Debug View Hierarchy
    Debug View Hierarchy
    • 我们为什么要了解View 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详解

    • 这是我在网上找的一张图, 比较直观
    View Hierarchy
    • 如上图所示, 可以把View Hierarchy看成翻转的树结构, 而window就是树的根节点, 而下面的view之间的关系就对应这subviews和superview的关系.
    • 此时我们点进UIView的头文件, 在下方可以找到view的类扩展@interface UIView(UIViewHierarchy),我们就可以根据上图理出View Hierarchy中的view的三种属性定义关系
      • 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的非常重要的部分, 当Responder Chain通过responder对象将处理事件的责任传递给下一个更高级的对象,即当前responder对象的nextResponder的时候,如果此时需要渲染window, 系统就会根据 View Hierarchy来检测views的layer的层次来判断需要进行渲染的部分,从而避免每次都重复渲染同一部分.

    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!

    • 我举一个前段时间, 我身边的一个朋友犯的一个错误吧作为例子吧.当接收到远程推送的时候的时候, 在AppDelegate.m中用之前定义好的一个UIViewController直接present到目标控制器, 然后再目标控制器取出UIWindow的rootViewController进行present.然后就报了上面的错.
    • 这种错误可以用一个通俗易懂的例子: 空中阁楼.在没有地基,没有第一层/第二层的情况下, 直接妄图搭建第三层楼.
    • 解决方法: 如果是类似我举的例子的情况, 可以直接使用当前的控制器进行present, 或者在控制器的viewDidAppear中去present.

    联系我

    <a href="https://github.com/SunLiner">github</a>

    <a href="http://www.weibo.com/5589163526/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1">微博</a>

    <a href="http://www.jianshu.com/users/9723687edfb5/latest_articles">简书</a>

    相关文章

      网友评论

        本文标题:View Hierarchy

        本文链接:https://www.haomeiwen.com/subject/rodclttx.html