Ios 为什么UIPopoverController不是UIViewController子类?

Ios 为什么UIPopoverController不是UIViewController子类?,ios,cocoa-touch,uiviewcontroller,uipopovercontroller,Ios,Cocoa Touch,Uiviewcontroller,Uipopovercontroller,你能想到苹果选择将UIPopoverController作为普通NSObject子类实现的具体原因吗?对我来说,UIViewController子类实现适当的UIViewController包含将更有意义 但也许有一些原因我没有想到,为什么苹果的bright工程师们做出了他们的选择?我认为这是因为,像UIAlertView一样,它是在一个新的UIWindow中显示的,所以windowLevel属性保证它在所有内容中都显示 无论它是否在新的UIWindow中,就视图控制器包含而言,在UIPopov

你能想到苹果选择将UIPopoverController作为普通NSObject子类实现的具体原因吗?对我来说,UIViewController子类实现适当的UIViewController包含将更有意义

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

我认为这是因为,像UIAlertView一样,它是在一个新的UIWindow中显示的,所以windowLevel属性保证它在所有内容中都显示

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

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

窗口:

_子视图类:UIView

___子视图类:UIRoundedRectButton

\u\u子子视图类:UIButtonLabel

___子视图类:UIRoundedRectButton

\u\u子子视图类:UIButtonLabel

_子视图类:UIDimmingView

___子视图类:_UIPopoverView

\u\u子子子视图类:\u UIPopoverStandardChromeView

\u\u子视图类:UIView

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


因此,如果苹果将UIPopoverController作为UIViewController的子类,那么它必须将其添加为rootViewController层次结构的子/子视图。但是,如果根视图控制器(无论如何,它是您的代码)决定显示干扰UIPopoverController视图层次结构的视图,该怎么办?与其让我们把事情搞砸,苹果似乎决定完全管理UIPopoverController的演示,但这样他们就不必为自己授予UIWindow的无兄弟视图控制器策略的例外。

因为
UIPopoverController
对象不与用户交互,这就是为什么它不是视图层的一部分,
UIViewController
能够与用户通信,
UIPopoverController
本身不做任何类似的工作

快速查看控制器的通用配置:

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


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

popover显示在相同的窗口中,这是使
直通视图
工作所必需的。对于视图控制器包含,我的意思是,对于弹出窗口的根视图控制器,
parentViewController
没有定义(可能还没有尝试)。当然,在内容视图控制器的各个级别中包含内容是可行的,但这不是我的观点。您更新的答案是有意义的。它必须位于根视图控制器的视图层次结构之外,以避免裁剪视图出现问题。因此,它不能成为UIViewController包含层次结构的一部分。这不能说服我。当用户点击内容之外的内容时,它肯定会在关闭popover时与用户进行交互。或者当缩小视图以容纳键盘等时,用户不能关闭popover,程序员(您)只能这样做。当然,用户可以通过点击popover外的屏幕来关闭它。