为啥 UIPopoverController 不是 UIViewController 的子类?

Posted

技术标签:

【中文标题】为啥 UIPopoverController 不是 UIViewController 的子类?【英文标题】:Why is UIPopoverController not a UIViewController subclass?为什么 UIPopoverController 不是 UIViewController 的子类? 【发布时间】:2012-08-16 11:49:07 【问题描述】:

你能想出 Apple 选择将 UIPopoverController 实现为普通 NSObject 子类的特殊原因吗?对我来说,一个 UIViewController 子类会更有意义,以实现适当的 UIViewController 包含。

但也许有我没有想到的原因,为什么苹果的聪明工程师做出了他们的选择?

【问题讨论】:

【参考方案1】:

我认为这是因为,就像 UIAlertView 一样,它呈现在一个新的 UIWindow 中,因此 windowLevel 属性保证它呈现在所有内容上。

无论它是否在新的 UIWindow 中,就视图控制器包含而言,在 UIPopoverController 中显示的视图控制器中使用复杂的父子视图控制器容器层次结构应该没有问题。对于某些弹出框,我在Pillboxie 中有至少三层嵌套的视图控制器,没有任何问题。

更新:我通过在示例项目中记录视图层次结构的前三个级别的类来检查层次结构,当弹出框可见时如下所示(我的根视图控制器有两个 UIButtons):

一个窗口:

_SUBVIEW 类:UIView

___SUBSUBVIEW 类:UIRoundedRectButton

__SUBSUBSUBVIEW 类:UIButtonLabel

___SUBSUBVIEW 类:UIRoundedRectButton

__SUBSUBSUBVIEW 类:UIButtonLabel

_SUBVIEW 类:UIDimmingView

___SUBSUBVIEW 类:_UIPopoverView

__SUBSUBSUBVIEW 类:_UIPopoverStandardChromeView

__SUBSUBSUBVIEW CLASS:UIView

Apple 的文档指出,UIWindow 中的根视图控制器的视图不应有由其他视图控制器管理的同级视图,因为这些同级视图控制器不会接收旋转事件(请参阅here,第二个项目符号)。

因此,如果 Apple 将 UIPopoverController 设为 UIViewController 子类,则必须将其添加为 rootViewController 层次结构的子视图/子视图。但是,如果根视图控制器(无论如何,它是你的代码)决定呈现一个干扰 UIPopoverController 视图层次结构的视图怎么办? Apple 似乎决定完全管理 UIPopoverController 的呈现,而不是让我们搞砸它,但他们不必为 UIWindow 的 no-sibling-view-controllers 政策授予例外。

【讨论】:

弹出框显示在使passthroughViews工作所需的同一窗口中。对于视图控制器包含,我的意思是对于弹出窗口的根视图控制器,parentViewController (可能没有尝试过)未定义。在内容视图控制器的各个级别中包含当然是可行的,但这不是我的意思。 您更新的答案很有意义。它必须在根视图控制器的视图层次结构之外,以避免裁剪视图出现问题。因此它不能成为 UIViewController 包含层次结构的一部分。【参考方案2】:

因为UIPopoverController 对象不与用户交互,这就是为什么它不是View 层的一部分,您的UIViewController 能够与用户通信,@987654324 @ 在自身内部不做任何类似的工作。

快速查看控制器的通用definition:

控制器可以向其关联的视图发送命令以更改 视图对模型的表示(例如,通过滚动 文档)。它可以向模型发送命令以更新模型的 状态(例如编辑文档)。

它解释了为什么它不是 View 层的一部分,我希望它有所帮助。

【讨论】:

这并不能说服我。当用户在内容之外点击时关闭弹出框时,它肯定会与用户交互。或者在缩小视图以适应键盘等时。 用户不能关闭弹出框,程序员(你)只能这样做。 当然用户可以关闭它,只需点击弹出框外的屏幕即可。

以上是关于为啥 UIPopoverController 不是 UIViewController 的子类?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UITableViewController self.tableView 属性在 UIPopoverController 中呈现时为 Nil?

UITableView 在 UIPopoverController 中时,为啥单元格边界和帧大小不正确?

UIPopoverController 中的 iPad UIImagePicker 仅选择保存的图像(不是来自相册)?

UIPopoverController 没有箭头?

Safari 风格的 UIPopoverController

如何删除 UIPopoverController 中的“模糊”阴影