Iphone 使用UIKit视图操作时,整体视图层次结构如何更改?

Iphone 使用UIKit视图操作时,整体视图层次结构如何更改?,iphone,uiview,uiviewcontroller,uiactionsheet,uiwindow,Iphone,Uiview,Uiviewcontroller,Uiactionsheet,Uiwindow,我一直在试图弄清楚,当使用诸如pushViewController:animated、presentModalViewController:animated、UIAbbarViewController中的选项卡开关以及UIAlertView和UIActionSheet等方法时,视图层次结构中会发生什么 (旁注:我这样做是因为我不知道如何将我创建的特定UIView或其superview添加到视图层次结构时,我需要知道它是否在屏幕上可见。如果有人知道一个确定这一点的好方法,我欢迎了解。) 为了弄清楚

我一直在试图弄清楚,当使用诸如
pushViewController:animated
presentModalViewController:animated
、UIAbbarViewController中的选项卡开关以及UIAlertView和UIActionSheet等方法时,视图层次结构中会发生什么

(旁注:我这样做是因为我不知道如何将我创建的特定UIView或其superview添加到视图层次结构时,我需要知道它是否在屏幕上可见。如果有人知道一个确定这一点的好方法,我欢迎了解。)

为了弄清楚这一点,我已经在不同的情况下注销了[[UIApplication sharedApplication]keyWindow]子视图的层次结构。以下各项是否正确:

  • 将新的viewController推送到UINavigationController的堆栈上时,旧的viewController的视图将不再位于视图层次结构中。也就是说,只有俯视图控制器的视图是UINavigationController视图的子视图(根据日志,它实际上是几个私有类,如UILayoutContainerView)。堆栈顶部控制器下方的视图控制器视图是否实际从窗口中移除

  • 当通过
    presentModalViewController:animated
    显示新的viewController时,也会发生类似的情况。新viewController的视图是kew窗口的唯一子视图。这是正确的吗

  • 最容易理解的事情是:UIAlertView创建自己的窗口并将其设置为关键帧

  • 我遇到的最奇怪的事情是:UIActionSheet通过
    showInView:
    方法显示,actionSheet根本不在视图层次结构中。它不是作为参数传递给
    showInView:
    的视图的子视图,它不是作为键窗口的子视图添加的,它也不会创建自己的窗口。那它看起来怎么样

  • 我还没有尝试过这个,所以我想知道当UITabBarController中的选项卡被切换时,keyWindow层次结构中会发生什么。所选UIViewController的视图是否移动到顶部,或者它是否像使用
    pushViewController:animated
    presentModalViewController:animated
    一样工作,其中只有显示的视图在窗口层次结构中


  • 现在,我为UITabBarViewController执行了相同类型的日志记录,因此,考虑到第5部分:


    它的工作方式似乎与UINavigationController相同:只有与当前活动选项卡关联的视图控制器的视图位于keyWindow的视图层次结构中。

    我认为您在概念上混淆了视图和视图控制器。导航控制器和tabbar控制器管理器都是其他视图控制器。两者都不管理视图

    整个应用程序没有视图层次结构,只有视图控制器的层次结构。视图层次结构仅在加载每个受控视图时存在。然后,您就有了窗口-->视图控制器.视图-->视图控制器.视图.子视图的临时层次结构。当您在堆栈上推/弹出另一个视图控制器时,您将获得另一个视图层次

    视图层次结构是用户看到的舞台错觉。视图控制器层次结构是编程人员用来创建错觉的舞台集/后台。不要混淆两者

    因此:

  • 堆栈顶部控制器下方的视图控制器视图是否实际从窗口中移除?对当视图控制器弹出堆栈时,其视图将消失。为什么要浪费内存来保存用户可能再也看不到的视图
  • 新viewController的视图是kew窗口的唯一子视图。这是正确的吗?对
  • …UIAlertView创建自己的窗口并将其设置为关键帧。对
  • …操作表根本不在视图层次结构中。。。那它看起来怎么样?它是由窗口上方的应用程序添加的。这就是它的特殊之处。这也使得它能够出现在所有其他视图之上,即使这些视图失败
  • 所选UIViewController的视图是否移动到顶部?是。再次,舞台错觉。将一个控制器视图交换为另一个控制器视图
    UIView上的以下方法可以满足您的需要:

    – didAddSubview:
    – didMoveToSuperview
    – didMoveToWindow
    – willMoveToSuperview:
    – willMoveToWindow:
    – willRemoveSubview:
    

    我想你误解了我的问题。所谓视图层次,我指的是屏幕上显示的视图和子视图的层次。关于导航控制器,我的问题是如何将其堆栈上的视图控制器视图添加到该屏幕层次结构中。我不是说弹出的视图控制器。我说的是视图控制器,另一个视图控制器被推到该视图控制器上。它仍然在导航控制器的堆栈中,只是不在顶部。我想确认我做对了:实际上只有俯视控制器的视图在窗口中(在前面的评论中空间不足),谢谢操作表上的信息。通过交换,您的意思是只有可见视图在窗口中?(1)是的,一个视图交换为另一个视图。一次只有一个viewController.view处于活动状态。(2) 警报和UI表在技术上是窗口的同级视图,即它们存在于层次结构的同一顶层。因此,IIRC不会在窗口子视图的任何转储中看到它们(至少是警报)。谢谢,但我看到的日志显示UIAlertView是其自己窗口的子视图(属于类_UIAlertOverlayWindow),当alertView出现在屏幕上时,该窗口是关键窗口,虽然UIActionSheet根本不在任何窗口中,但它显示时的关键窗口仍然是应用程序的主窗口,而actionSheet不是它的子视图。TechZen在这里将其几乎完全向后放置。整个应用程序确实有一个视图层次结构,从一个(或有时多个)UIWindow开始,向下进入其嵌套的子视图。其中一些子视图可以具有与视图关联的视图控制器