2011-03-23 75 views
2

如果我想用另一个应用程序的一个屏幕替换,但我不使用导航栏/ TabBar控制器,那么我可以从窗口中删除oldViewController.view并添加newViewController.view。就是这样,现在newViewController会得到旋转事件等等。iOS如何知道哪个视图控制器应该处于活动状态?

但是UIView没有引用“它的”控制器,所以这怎么可能,iOS知道它应该让newViewController成为一个活动的控制器? iOS是否有一些神奇的功能,它从内部引用控制器还是什么?

UPDATE:

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

+0

我认为它的确如此。如果从视图控制器向窗口添加第二个视图,它将不会仅获取第一个视图中的旋转事件。 – Joe 2011-03-23 14:43:30

回答

2

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

如果你不使用导航栏/标签栏控制器,你将不得不每次从Window添加和删除,如果你魔杖有事件时,只保留一个。

1

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

+1

+1,但该属性仅适用于SDK 4.0以后的版本。只需将主UIWindow的'rootViewController'属性设置为新的视图控制器即可。它的视图将被安装为“作为窗口的内容视图”(来自doc)。 – Jilouc 2011-03-23 15:06:03

+0

感谢有关rootViewController的信息,但这不是我的问题的答案。如果你做[window addSubview:view],那么rootViewController会自动设置,尽管UIWindow对象应该不知道关于传递视图的视图控制器。我很好奇,如果这是一些内在的魔法或者我可能不了解的东西。 – broot 2011-03-23 16:00:31

3

你好我有和你一样的问题。我想到了。

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

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

所以,因此视图可以看到它的控制器。这意味着窗口知道最上面的视图,并且也是其控制器。

祝你好运。

相关问题