self.window.rootViewController vs window addSubview

时间:2011-03-09 16:00:50

标签: iphone objective-c

我在应用程序代表

中注意到很多iPhone应用程序示例

- (void)applicationDidFinishLaunching:(UIApplication *)application

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

而不是

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

是否有任何实际理由使用其中一个?技术上是否正确?控制器是否具有与数字(2)相同的命令,如

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

5 个答案:

答案 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将根据状态栏高度

调整rootViewController.view的大小

但如果使用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。