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

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

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

更新:

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

【问题讨论】:

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

标签: iphone ios ipad uiviewcontroller


【解决方案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 对象不应该知道任何有关传递视图的视图控制器的信息。我很好奇这是某种内在的魔法还是我不明白的东西。
      猜你喜欢
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 2016-06-23
      • 2013-03-30
      • 2012-08-09
      相关资源
      最近更新 更多