self.window.rootViewController vs窗口addSubview

我注意到在应用程序委托中有很多iPhone应用程序的例子

- (void)applicationDidFinishLaunching:(UIApplication *)application

[window addSubview: someController.view]; (1)

而不是

self.window.rootViewController = self.someController; (2)

是否有任何实际的理由使用一个在另一个? 技术上是否正确? 控制器有一个等同的命令编号(2)像

self.someController.rootController = self.someOtherController; // pseudocode

UIWindow rootViewController属性是iOS4新增的。

较旧的技术是使用addSubview

新推荐的技术是设置rootViewController

只是与iOS 6的发布有关的更新。

如果仍然使用 – [UIWindow addsubview:]样板,那么您现在可能会在控制台中看到“应用程序窗口在应用程序启动结束时有一个根视图控制器”消息。 随着您的应用程序中的潜在旋转问题和布局问题。

像上面那样设置窗口的rootViewController也会解决这个问题。

我使用这个代码:

  rootViewController_ = [[RootViewController alloc] initWithFrame:[UIScreen mainScreen].bounds]; window_ = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; if ([window_ respondsToSelector:@selector(setRootViewController:)]) { // >= ios4.0 [window_ setRootViewController:rootViewController_]; } else { // < ios4.0 [window_ addSubview:rootViewController_.view]; } 

我的想法:

self.window.rootViewController会根据状态栏高度调整self.window.rootViewController大小

但是,如果你使用addSubview它不会

例如,如果将RootViewController设置为NavigationController,则navigationController将为(0,0,320,480);

但是如果你将RootViewController设置为一个普通的UIViewController,navigationController将是(0,0,320,460);

如果你使用addSubview:两个viewcontrollers将是(0,0,320,480)

如果有一个In-call-StatusBar。 当你使用setRoot的时候它也会改变…如果你使用addSubview,子视图的大小不会改变

用不同的视图边框颜色做一些testing

崩溃是因为你正在调用一个不存在的方法,不是因为你的variables没有被初始化。

-setRootViewController在iOS 4.0之前不存在。 使用

[self.window addSubview:self.tabBarController.view]; 代替。

或者,将您的目标平台更新到4.0.2或更高版本。 目前还没有使用iOS 4的用户不到5%。