我在应用程序代表
中注意到很多iPhone应用程序示例 - (void)applicationDidFinishLaunching:(UIApplication *)application
有
[window addSubview: someController.view];
(1)
而不是
self.window.rootViewController = self.someController;
(2)
是否有任何实际理由使用其中一个?技术上是否正确?控制器是否具有与数字(2)相同的命令,如
self.someController.rootController = self.someOtherController; // pseudocode
答案 0 :(得分:49)
UIWindow
rootViewController
属性是iOS4的新功能。
较旧的技术是使用addSubview
。
新推荐的技术是设置rootViewController
。
答案 1 :(得分:10)
只是对ios 6的发布进行了更新。
如果仍然使用 - [UIWindow addsubview:]样板文件,您现在可能会在控制台中收到消息“应用程序窗口应该在应用程序启动结束时有一个根视图控制器”。以及应用中的潜在轮换问题和布局问题。
如上所述设置窗口的rootViewController也可以解决这个问题。
答案 2 :(得分:5)
我使用此代码:
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];
}
答案 3 :(得分:1)
我的意见:
self.window.rootViewController
将根据状态栏高度
但如果使用addSubview则不会
例如, 如果你将setRootViewController设置为NavigationController, navigationController将是(0,0,320,480);
但是如果你将setRootViewController设置为一个普通的UIViewController, navigationController将是(0,0,320,460);
如果你使用addSubview:两个viewcontrollers将是(0,0,320,480)
如果有一个In-call-StatusBar。当你使用setRoot时它也会改变你... 如果您使用addSubview,则子视图大小不会更改
使用不同的视图边框颜色进行一些测试
答案 4 :(得分:-1)
崩溃是因为你正在调用一个不存在的方法,而不是因为你的变量没有被初始化。
iOS 4.0之前不存在 -setRootViewController
。使用
[self.window addSubview:self.tabBarController.view];
代替。
或者,将目标平台更新为4.0.2或更高版本。目前,可能只有不到5%的用户没有使用iOS 4。