如何为旧设备加载不同的视图控制器?

时间:2012-05-07 23:42:24

标签: iphone objective-c

我的应用程序的新版本取决于iOS 5.0+。但是,我的旧版本允许使用iOS 4.如果我没记错,Apple会拒绝该应用,如果它删除了对某些用户的支持。我试图让不在iOS 5.0+上的设备加载另一个名为oldVersion的XIB。以下是我尝试过的内容:

float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version < 5.0) {
    UIViewController *olderVersion = [[[ViewController alloc] initWithNibName:@"oldVersion" bundle:nil] autorelease];
    self.window.rootViewController = olderVersion;
    [self.window makeKeyAndVisible];
} else {
    //Load normally.
}

(这是在应用代表&#39; s - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions


我也试过加载我的新版本和

float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version < 5.0) {
    oldVersion *screen = [[oldVersion alloc] initWithNibName:nil bundle:nil];
    [self presentModalViewController:screen animated:NO];
    [screen release];
    return;
} else {
    //Normal stuff...
}

在我的viewDidLoad中。它们都没有正常工作。第一个(在app委托中)加载屏幕但不加载代码中的任何内容(如NSLog()和UIAlertView)。第二个(viewDidLoad)没有显示屏幕,它只是加载我的新版本而没有我在代码中做的任何自定义。

那么,如何将不在iOS 5.0+上的设备发送到oldVersion

3 个答案:

答案 0 :(得分:0)

在viewDidLoad中,检查版本并将其记录到nsuserdefaults,这样您就不必每次都检查它。然后加载新视图。

答案 1 :(得分:0)

您可以检查对象是否实现了仅在较新版本的操作系统上可用的方法。这是检查当前运行时环境的常用方法。例如:

if ( [[UIApplication sharedApplication] respondsToSelector(userInterfaceLayoutDirection)] ) {
    // userInterfaceLayoutDirection is only available in iOS 5+
    // use 5.0+ version of xib
}

我相信你也可以检查一个常量的地址是不是nil,并从中得出OS版本:

if ( &UIApplicationLaunchOptionsNewsstandDownloadsKey != nil ) {
    // UIApplicationLaunchOptionsNewsstandDownloadsKey is only available in iOS 5+
    // use 5.0+ version of xib
}

答案 2 :(得分:0)

我解决了!显然,在显示新的XIB之前,我所要做的就是稍微等一下(我使用的是0.1)。所以现在是:

[self performSelector:@selector(usersOnOldVersionsOfiOSReallyNeedToUpgradeToiOS5OrHigherToUseThisVeryCoolApp) withObject:nil afterDelay:0.1];

其中usersOnOldVersionsOfiOSReallyNeedToUpgradeToiOS5OrHigherToUseThisVeryCoolApp打开XIB for gt; iOS 5。