UIViewControllerHierarchyInconsistencyException异常

北城余情 提交于 2019-11-28 12:37:33
IOS中的MVC

      MVC模式是一种经典的软件架构模式,基本上懂程序设计的人都了解或应用过MVC模式。多数面向对象的程序设计架构都得益于MVC模式来有效的划分程序中的对象的角色,组织对象之间的耦合关系(MVC的具体定义和描述可以参见 维基百科),Cocoa Touch提供了IOS的开发环境,包含了诸多基础类库和框架,其中UIKit框架提供并实现了MVC模式。在IOS中UIViewController表示控制器,UIView代表视图。每一个UIViewController对象中都拥有一个view属性用以管理一组UIView对象。做过IOS开发的人都知道,一个Application的记载过程都伴随着两个对象树结构的生成,一个是控制器树形结构,另一个是视图树形结构,在UIViewController的viewDidLoad方法中,我们可以创建多个子控制器,并将子控制器下的view对象添加至父控制器的view对象中,这样依次迭代最终会完成两个对象树的创建。如图
                                        

      其实,做过前端开发的人都看的出来,图中的controller的树结构和view的树结构,单独拿出一个来都和DOM的树结构类似,都是父与子,兄弟与兄弟之间的关系。

异常的出现

      前面简单的描述了一下controller树和view树,其实这里面是有一点规定的,即:controller的树节点必须与view的树节点在层次结构上保持一致。这里所谓的一致是指一个subController所管理的view必须是其父控制器superViewController所管理view的子view 。这个一致性的规定好像在IOS的开发文档中并没有着重说明,可能是本人自己还未看到。因之前在项目中不小心违背了这个规定,因此得到一下错误:

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', 
reason: 'child view controller:<ViewControllerC: 0x6a3b7c0> should have parent view controller:<ViewControllerB: 0x6a46990> but actual parent is:<ViewControllerA: 0x6a49f70>'

      错误的说明很简单。所以循着错误的提示,就在IOS文档中搜索了一下UIViewControllerHierarchyInconsistency异常,发现该异常就在UIViewController类文档的最下方。
其释义大致如下:
因控制器的层次与视图的层次不一致会引发该异常。 当视图控制器的视图添加到视图层中,系统会遍历视图层来找到其第一个拥有视图控制器的父视图。找到的该父视图的视图控制器也必须是刚添加的 视图的所对应视图控制器的父控制器。否则会抛出该异常。当视图控制器通过addChildViewController方法被添加进来后,也会进行之前的一致性监测。 不存在父试图控制器的视图控制器,也可以将其视图添加到视图层中。但通常极少数情况下才会用到这种方式。
      源文档直译过来有些拗口建议大家参考下 源文档释义
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!