为什么UIPopoverController不是UIViewController的子类?

问题描述:

您能否想到Apple为什么选择将UIPopoverController作为普通NSObject子类实现的特殊原因?对我来说,一个UIViewController子类将更有意义,以实现适当的UIViewController遏制。为什么UIPopoverController不是UIViewController的子类?

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

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

无论它是否在新的UIWindow中,就视图控制器遏制而言,在UIPopoverController中显示的视图控制器中使用复杂的父子视图控制器容器层次结构应该没有问题。我对 Pillboxie至少有三个级别的嵌套查看控制器的一些popovers,没有任何问题。

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

的窗口:

_SUBVIEW类:UIView的

___SUBSUBVIEW类:UIRoundedRectButton

_ _SUB SUBSUBVIEW CLASS:UIButtonLabel

___SUBSUBVIEW类:UIRoundedRectButton

_ _SUBSUBSUBVIEW类:UIButtonLabel

_SUBVIEW类:UIDimmingView

___SUBSUBVIEW类:_UIPopoverView

_ _SUBSUBSUBVIEW类:_UIPopoverStandardChromeView

_ _SUBSUBSUBVIEW类:UIView的

苹果的文档指出根视图控制器在一个UIWindow视图应该没有兄弟姐妹的观点被其他视图控制器进行管理,因为这些兄弟姐妹视图控制器将不会收到旋转事件(见here ,第二颗子弹)。

因此,如果Apple已经将UIPopoverController作为UIViewController的子类,那么它将不得不将其添加为rootViewController的层次结构的子/子视图。但是,如果根视图控制器(无论如何是代码)决定呈现一个干扰UIPopoverController视图层次结构的视图?似乎苹果决定完全管理UIPopoverController的表现,而不是让他们自己对UIWindow的无兄弟视图控制器策略给予例外。

+0

弹出窗口显示在需要使'passthroughViews'工作的窗口中。对于视图控制器遏制,我的意思是说,对于弹出窗口的根视图控制器,“parentViewController'(可能没有尝试过)没有定义。遏制内容视图控制器的各个层次的课程作品,但这不是我的观点。 – 2012-08-16 12:20:46

+0

您更新的答案很有意义。它必须位于根视图控制器的视图层次结构之外,以避免修剪视图出现问题。因此它不能成为UIViewController包含层次结构的一部分。 – 2012-08-16 14:28:10

因为UIPopoverController的对象不与用户进行交互,这就是为什么它是不是查看层的一部分,你的UIViewController能够与用户进行沟通,该UIPopoverController没有做内部本身的任何类似的工作。

我们快速浏览一下该控制器的通用definition

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

它解释了为什么它不是查看层,我希望它能帮助的一部分。

+0

这并不能说服我。当用户点击内容外时,它肯定会与用户进行交互。或者当缩小视图以容纳键盘等。 – 2012-08-16 14:25:32

+0

用户**不能**解除弹出,程序员(你)只能做到这一点。 – holex 2012-08-16 16:36:11

+0

当然用户可以关闭它,只需点击弹出窗口外的屏幕即可。 – 2012-08-18 10:38:56