为什么UIWindow既是UIView的父视图又是子视图?

5

UIKit参考文档称UIView是UIWindow的超类,但尽管如此,UIWindow实际上管理UIView。这对我来说听起来很不寻常。

有人知道这在软件设计方面的意义吗?

非常感谢。

编辑:
我读了iPhone编程指南中相关的段落。然而,我无法看出为什么他们要反过来:让UIWindow成为UIView的父类。一定有一些东西迫使苹果以这种方式设计类层次结构。


你是不是混淆了父子概念和子类/超类概念?UIWindow 是 UIView 的一个子类,但不是它的“子级”。一个 UIWindow 有 UIView 作为子级。 - tml
3个回答

5
来自http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/WindowsandViews/WindowsandViews.html UIWindow类的继承方式可能会让有经验的Mac OS X开发人员感到不寻常。 在Mac OS X中,NSWindow的父类是NSResponder。 在iPhone OS中,UIWindow的父类是UIView。 因此,在iPhone OS中,窗口也是一个视图对象。 尽管有这样的父级关系,您通常在iPhone OS中处理窗口与在Mac OS X中一样。 也就是说,您通常不直接操作UIWindow对象的与视图相关的属性。
编辑:
UIView是一些通用的东西(提供创建所有类型视图并访问其属性的常用方法)。 而UIWindow更具体(类定义了管理和协调应用程序在屏幕上显示的窗口的对象。)
我知道这有点模糊,我认为只有苹果才知道这种层次结构的确切原因。 http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIWindow_Class/UIWindowClassReference/UIWindowClassReference.html#//apple_ref/occ/cl/UIWindow UIWindow类定义了对象(称为窗口),这些对象管理和协调应用程序在屏幕上显示的窗口。 窗口的两个主要功能是提供显示其视图的区域并将事件分配给视图。
以及http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView UIView类提供了常用方法,您可以使用这些方法创建所有类型的视图并访问它们的属性。 例如,除非子类有自己的指定初始化程序,否则可以使用initWithFrame:方法来创建视图。 frame属性指定父视图坐标系中视图的原点和大小。 所有视图的坐标系原点在左上角。
UIView对象按层次结构排列在UIWindow对象中,并形成子视图的嵌套层次结构。 视图层次结构中的父对象称为父视图,子对象称为子视图。 视图对象声明其封闭父视图的矩形区域,负责该区域内的所有绘图,并有资格接收发生在其中的事件。 兄弟视图可以重叠而没有任何问题,从而允许进行复杂的视图放置。

0

每个常规的UIView,包括主窗口的根视图,都应该有一个父视图。UIWindow继承自UIView,在视图层次结构中执行父视图的职责。 UIWindow不是常规视图,并且具有从UIView接口实现方法的自己的实现。


0

因为每个UIView都会继承只对窗口有意义的属性和行为,这是错误的。

相反的方式更有意义:窗口在视图上添加行为。所以它可以绘制、有边界、包含其他视图等等。但它通过知道如何渲染到显示器等方面进行了扩展。

在MacOS X中,NSWindows不是视图。它们包含一个名为contentView的“根视图”。iOS窗口是NSWindow +其根视图的组合。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接