iOS:有没有一种方法可以不使用viewWillAppear / viewWillDisappear找出应用程序在屏幕上显示的ViewController?

不幸的是,没有直接的方法可以找到答案,这取决于您的视图层次结构。

主要问题是,顶部可能有多个视图控制器。 对于iPad尤其如此,但甚至在iPhone上也是如此。 没有什么可以阻止您使用自定义视图控制器包含其他视图控制器的,并且不一定以任何方式公开它。

因此,您开始必须了解导航层次结构是什么样的,然后使用它来确定最重要的层次结构。

如果您使用的是Apple的容器控制器,则UINavigationController具有topViewController属性。 UITabBarController已经选择了ViewController,依此类推。

如果使用自定义类,则可以提供自己的方法来确定顶视图控制器。

但是,这还不够。 例如,您可以显示一个模式视图控制器,这将是另外一种情况。

如您所见,没有简单的解决方案。 如果您确切分享您要实现的目标,也许我们可以提出一个替代解决方案。 例如,也许您只需要最顶层的视图,那可能会有一个更简单的答案。

您可以使用UIWindow的contentView属性:[myWindow contentView]。

根据Apple Cocoa的文档,“ contentView”:
返回窗口的内容视图,即窗口视图层次结构中可访问性最高的NSView对象。

实际上,屏幕上通常经常同时存在许多视图控制器。 您可以通过UIWindow的rootViewController属性访问顶层视图,然后通过其childViewControllers属性访问显示的任何视图控制器,并通过其childViewControllers属性访问子级,依此类推。 通过递归遍历所有这些childViewControllers属性,您最终可以检查或收集当前可见的所有视图控制器。

但是,通常有更好的方法来执行您要尝试执行的操作:

  • 如果您想记住哪个屏幕是可见的,以便在用户重新启动时可以返回到该屏幕,则可可触摸的状态恢复API旨在实现这一目的。
  • 如果要检查特定的选项卡栏或导航控制器,请将其连接至插座,以便稍后使用。 如果要告诉您何时切换屏幕,它们两个都有接收该信息的代表。
  • 如果要查找特定的视图控制器,以便可以告诉它模型的某些部分已更新,请通过NSNotificationCenter广播更新,然后让视图控制器观察该通知。

与使用为手头任务设计的API相比,遍历视图控制器层次结构本质上更慢,更脆弱且更困难。

然后,您可以创建自己的经理。 通常我为此使用Singletons。 在viewDidLoad中,您可以使用枚举或将`this`传递给单例来保存视图,该单例将存储当前视图的值。 我在大多数Android,iOS和C ++应用程序中都做了同样的事情。

好吧,viewWillAppear和viewWillDisappear是针对您正在做的事情而设计的。 您可以按照其他人的建议跟踪视图层次结构,但这似乎是回旋处,并且可能是错误的代码。

您是不是要尝试找到具有焦点的viewController? 通常,屏幕上不止一个viewController。 如果是这种情况,请查看“ focused”属性。