Iphone self.window.rootViewController与window addSubview

Iphone self.window.rootViewController与window addSubview,iphone,objective-c,Iphone,Objective C,我注意到应用程序代理中有很多iPhone应用程序的示例 -(void)applicationdFinishLaunching:(UIApplication*)应用程序 有 [窗口添加子视图:someController.view](1) 相对于 self.window.rootViewController=self.someController(2) 是否有任何实际的理由使用一个而不是另一个?技术上正确吗?控制器是否有与数字(2)相同的命令 self.someController.rootCon

我注意到应用程序代理中有很多iPhone应用程序的示例

-(void)applicationdFinishLaunching:(UIApplication*)应用程序

[窗口添加子视图:someController.view](1)

相对于

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

是否有任何实际的理由使用一个而不是另一个?技术上正确吗?控制器是否有与数字(2)相同的命令


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

iOS4新增了
UIWindow
rootViewController
属性

较旧的技术是使用
addSubview


推荐的新技术是设置
rootViewController

崩溃是因为调用的方法不存在,而不是因为变量未初始化

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

[self.windowaddsubview:self.tabBarController.view]
相反

或者,将目标platfor更新为4.0.2或更高版本。目前不使用iOS 4的用户可能不到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];
    }
rootViewController\[[rootViewController alloc]initWithFrame:[UIScreen mainScreen].bounds];
窗口\=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
如果([window_uRespondsToSelector:@selector(setRootViewController:)]){/>=ios4.0
[窗口\设置rootViewController:rootViewController\];
}else{/
我的看法:

self.window.rootViewController
将根据状态栏高度调整rootViewController.view的大小

但是,如果使用addSubview,则不会

比如说,, 如果将RootViewController设置为NavigationController, 导航控制器应为(0,0320480)

但如果将RootViewController设置为公共UIViewController, 导航控制器为(0,0320460)

如果使用addSubview:两个ViewController将是(0,0320480)

如果在状态栏中有呼叫。当您使用setRoot时,它也会为您更改。。。 如果使用addSubview,子视图的大小不会改变


使用不同的视图边框颜色进行一些测试

这只是ios 6发布后的更新

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


如上所述设置窗口的rootViewController也可以解决此问题。

为什么建议设置rootViewController而不是addSubview?百事可乐可以告诉你,它在iOS 5.0上更有意义,属于NDA,因此我们不能在这里讨论,在开发论坛上询问,你会得到它,它与视图控制器包含有关。一个有争议的好处是,作为属性,您可以在IB中设置它,而不是编写代码来执行关联。不要合并这两种技术!它会导致奇怪的行为,有时会导致自动旋转停止工作。
rootViewController
在iPad上的应用程序中创建新的游戏中心帐户时工作不正常-基础视图消失。当主视图添加了
addSubview
时,同样的效果也很好。是的,即使ViewController使用了新的iOS6旋转API,我的视图也显示在错误的方向上……直到我修复了这个问题!看在上帝的份上!我已经收到这条消息好几个星期了,直到现在我才找到一个合适的解决方案,因为我没有在寻找它!