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