Iphone UIWindow rootViewController的向后兼容性

Iphone UIWindow rootViewController的向后兼容性,iphone,ios,uiviewcontroller,backwards-compatibility,uiwindow,Iphone,Ios,Uiviewcontroller,Backwards Compatibility,Uiwindow,创建新的基于Xcode 4视图的项目时,它会在ApplicationLegate didFinishLaunching方法上创建该行: self.window.rootViewController = self.viewController; 但是属性rootViewController仅在iOS 4.0中出现 我可以在这里写些什么来兼容4.0之前的iOS 注意:由于一些问题,我无法测试解决方案,所以请确定。使用内省来检测运行时UIWindow类是否具有该属性,如果没有,只需将视图控制器的视图

创建新的基于Xcode 4视图的项目时,它会在ApplicationLegate didFinishLaunching方法上创建该行:

self.window.rootViewController = self.viewController;
但是属性
rootViewController
仅在iOS 4.0中出现

我可以在这里写些什么来兼容4.0之前的iOS


注意:由于一些问题,我无法测试解决方案,所以请确定。

使用内省来检测运行时
UIWindow
类是否具有该属性,如果没有,只需将视图控制器的视图作为子视图添加到窗口中即可

if ([UIWindow instancesRespondToSelector:@selector(rootViewController)]) {
    self.window.rootViewController = self.viewController;
} else {
    [self.window addSubview:self.viewController.view];
}

菲切克的回答完全正确+我同意这个答案


但是,请记住,iOS 2应用程序。当iOS5面世时,iOS3也可能出现同样的情况。据说iOS 5将在一个月内推出。

100%确定。如果仍然有一个项目的副本,并且在引入rootViewController属性之前看到根视图控制器的视图作为子视图添加到窗口中,则可以尝试在Xcode 3中创建该项目。和
+InstanceRespondToSelector:
是用于向后兼容的基本内省方法之一。如果允许的版本数为40000,则与InstanceRespondToSelector有什么区别?
\if
是编译器条件语句。当您使用4.0或更高版本的SDK编译代码时,它将在
#if
#endif
之间编译代码<代码>+实例响应选择器:以与每个sdk相同的方式编译,并在应用程序运行时检查此选项,然后根据此选项执行正确的选择器。这是Objective-C的主要优点之一。动态运行时允许您执行类似操作。删除armv6支持和保留iOS 3.X支持没有什么意义,因此我希望他们也删除iOS 3.X支持。除了>3.2,它非常接近iOS 4 api,甚至支持此属性。+1用于删除iOS 3.x支持。写那些向后兼容的代码太难看了。