iOS 如何知道哪个视图控制器应该处于活动状态?

Posted

技术标签:

【中文标题】iOS 如何知道哪个视图控制器应该处于活动状态?【英文标题】:How does iOS know which view controller should be active? 【发布时间】:2011-03-23 14:40:10 【问题描述】:

如果我想用另一个屏幕替换应用程序的一个屏幕,但我不使用导航栏/标签栏控制器,那么我可以从窗口中删除 oldViewController.view 并将 newViewController.view 添加到它。就是这样,现在 newViewController 将获得旋转事件等。

但是 UIView 没有引用“它的”控制器,那么这怎么可能,ios 怎么知道它应该使 newViewController 成为活动控制器? iOS 有什么魔力,它在内部从视图中引用控制器还是什么?

更新:

我想我被误解了:我没有问如何使某些视图控制器成为活动的——我知道这一点。我只是好奇,我怎么可能将一些视图传递给 UIWindow 对象([window addSubview:view])并且它以某种方式找到了视图控制器,尽管视图不知道它的控制器。

【问题讨论】:

我认为确实如此。如果您从视图控制器向窗口添加第二个视图,则它不会仅获取第一个视图的旋转事件。 【参考方案1】:

是的,我和你有同样的问题。我想通了。

UIView 派生自 UIResponder。并且 UIView 必须继承 UIResponder::nextResponder。

它的默认实现是返回视图的视图控制器(如果没有,它将是超级视图)

因此,视图可以看到它的控制器。这意味着窗口知道最顶层的视图并且也

它的控制器。

祝你好运。

【讨论】:

【参考方案2】:

不幸的是,iOS 仅将事件发送到堆栈的第一个 ViewController。例如,您可以尝试用视频在其他人的顶部展示一个新的,它永远不会旋转。

如果您不使用导航栏/标签栏控制器,则每次都必须从 Window 添加和删除,以便在您想要有事件时一次只保留一个。

【讨论】:

【参考方案3】:

应用程序的主 UIWindow 类将在其 rootViewController 属性中设置一个视图控制器。该控制器的视图是应用程序的“主”视图。这通常在项目的主 .xib 中设置。该视图控制器将接收通常的事件,如“viewDidAppear”或“willRotateToInterfaceOrientation”。如果您愿意,您可以在上面放置您自己的视图,但您需要自己管理这些事件。通常你不会那样做。您只需使用 UINavigationController 或 UITabBarController 作为您的 rootViewController 并允许他们管理将事件发送到新的“推送”视图控制器,或者您使用“presentModalViewController”弹出视图控制器。

【讨论】:

+1 但该属性仅从 SDK 4.0 开始可用。只需将主 UIWindow 的 rootViewController 属性设置为新的视图控制器。它的视图将被安装为“作为窗口的内容视图”(来自文档)。 感谢您提供有关 rootViewController 的信息,但这不是我问题的答案。如果您执行 [window addSubview:view],则会自动设置 rootViewController,尽管 UIWindow 对象不应该知道任何有关传递视图的视图控制器的信息。我很好奇这是某种内在的魔法还是我不明白的东西。

以上是关于iOS 如何知道哪个视图控制器应该处于活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

Ios:当应用程序处于非活动状态时,如何让我的应用程序返回根视图

切换回搜索栏处于活动状态时,选项卡栏视图变为空白

当执行器处于活动状态时,我应该使用哪个注释来防止弹簧引导保护我的控制器

当执行器处于活动状态时,我应该使用哪个注释来防止弹簧引导保护我的控制器

如何确定当前视图控制器是不是处于活动状态,如果处于活动状态则执行代码

Django 和 Bootstrap:知道哪个选项卡处于活动状态