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%。