5

UIKit 参考说 UIView 是 UIWindow 的超类,但尽管有这种父级,但 UIWindow 实际上管理 UIView。这对我来说听起来很不寻常。

有谁知道这在软件设计方面有什么意义?

非常感谢。

编辑:
我阅读了 iPhone 编程指南中的相关段落。然而我不明白为什么他们会反其道而行之:让 UIWindow 成为 UIView 的父级。一定有什么东西迫使 Apple 以这种方式设计类层次结构。

4

3 回答 3

5

来自http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/WindowsandViews/WindowsandViews.html

有经验的 Mac OS X 开发人员可能会发现 UIWindow 类不寻常的一件事是它的继承。在 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 类定义管理和协调应用程序在屏幕上显示的窗口的对象(称为 windows )。窗口的两个主要功能是提供一个用于显示其视图的区域以及将事件分发到视图。

http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView

UIView 类提供了用于创建所有类型的视图并访问它们的属性的常用方法。例如,除非子类有自己指定的初始化程序,否则您可以使用 initWithFrame: 方法来创建视图。frame 属性指定视图在超级视图坐标中的原点和大小。所有视图的坐标系原点都在左上角。

UIView 对象排列在 UIWindow 对象中,在子视图的嵌套层次结构中。视图层次结构中的父对象称为超级视图,子视图称为子视图。视图对象声称其封闭父视图的矩形区域,负责该区域内的所有绘图,并且有资格接收发生在其中的事件。同级视图能够毫无问题地重叠,从而允许复杂的视图放置。

于 2009-05-06T17:59:20.430 回答
0

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

另一种方式更有意义:窗口在视图之上添加行为。所以它可以绘制、有边界、包含其他视图等。但它扩展了这一点,例如,知道如何渲染到显示器。

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

于 2011-03-17T12:52:09.563 回答
0

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

于 2017-05-24T05:53:29.560 回答