前言
-
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>