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:当应用程序处于非活动状态时,如何让我的应用程序返回根视图
当执行器处于活动状态时,我应该使用哪个注释来防止弹簧引导保护我的控制器
当执行器处于活动状态时,我应该使用哪个注释来防止弹簧引导保护我的控制器