Iphone 我应该如何使我的应用程序适应iOS 5.0并保持与iOS 4的兼容性

Iphone 我应该如何使我的应用程序适应iOS 5.0并保持与iOS 4的兼容性,iphone,objective-c,ios,ios5,Iphone,Objective C,Ios,Ios5,我今天开始玩iOS5,我看到XCode 4.2只允许我选择iOS5作为基本SDK,而不是iOS4 到目前为止,我已经覆盖了UINavigationBar中的drawRect:method来定制它的外观,但iOS5不再调用该方法。现在我必须使用[UINavigationBar外观]来实现这一点(我认为这要好得多)。然而,外观方法仅在iOS 5中可用,所以如果我使用它,我的应用程序在iOS 4上执行时会崩溃。我该怎么办?我是否必须在每个使用iOS 5方法的地方使用宏检查iOS版本 谢谢, Ariel

我今天开始玩iOS5,我看到XCode 4.2只允许我选择iOS5作为基本SDK,而不是iOS4

到目前为止,我已经覆盖了UINavigationBar中的drawRect:method来定制它的外观,但iOS5不再调用该方法。现在我必须使用[UINavigationBar外观]来实现这一点(我认为这要好得多)。然而,外观方法仅在iOS 5中可用,所以如果我使用它,我的应用程序在iOS 4上执行时会崩溃。我该怎么办?我是否必须在每个使用iOS 5方法的地方使用宏检查iOS版本

谢谢,


Ariel

您可以在iOS 4使用的drawRect和[UINavigationbar外观]返回的代理中放置相同的代码。两种不同的代码路径。

宏不能这样做,因为两种代码路径都必须到位,正确的路径取决于运行时检查

太好了。。。使用类似以下内容:

NSString *os_version = [[UIDevice currentDevice] systemVersion]; 

要获取当前运行的iOS版本并在5及更新版本下执行[UINavigationBar外观],您可以返回到iOS 4上的drawRect功能。

另一种自定义标题的方法如下所示

UIImage *image = [UIImage imageNamed:@"header.png"];

if([navigationBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)] ) {
    //iOS 5 new UINavigationBar custom background
    [navigationBar setBackgroundImage:image forBarMetrics: UIBarMetricsDefault];
} 
else{
    UIImageView *imgView = [[[UIImageView alloc] initWithImage:image] autorelease];
    [imgView setUserInteractionEnabled:NO];
    [imgView setTag:TOOLBAR_TAG];
    [navigationBar insertSubview:imgView atIndex:0];
}

使用respondsToSelector,您可以知道函数是否在这里。

第一个问题的答案是:您必须使用iOS5(或最新的iOS SDK)作为基本SDK,但必须在部署目标下设置支持的最低iOS版本。您可以在那里设置iOS4.0(或任何您想要的)

处理第二个问题的正确方法是测试功能,而不是版本。因此,类似这样的方法可以在您的
应用程序:didFinishLaunchingWithOptions:
方法中使用:

// iOS5-only to customize the nav bar appearance
if ([[UINavigationBar class] respondsToSelector:@selector(appearance)]) {
    UIImage *img = [UIImage imageNamed: @"NavBarBackground.png"];
    [[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault];
}
然后,您将根据ios5sdk编译此代码,因此完全可以使用
appearance
。但是,当编译后的代码在iOS 5之前的版本上运行时,就可以了


如前所述,您可以保持
drawRect:
代码不变。

还可以利用下载iPhone和iPad的4.3模拟器的优势。然后,当你在4.3上意外使用iOS5时,你可以更快地崩溃
--Tom

他们过去支持安装多个SDK,但我想现在已经没有了。这是个坏主意。从技术上讲,使用操作系统版本将适用于大多数情况,但它不是一个可靠的解决方案。假设tintColor在iOS 5中添加了UIBarButtonItem,在iOS 6中被弃用,在iOS 7中被删除。安装了iOS 5版本的应用程序将在假想的iOS 7中停止正常工作。当然,您可以随着时间的推移发布更新,从而增加额外的条件和复杂性,但为什么不使用-[respondsToSelector:]而不用担心过去或未来呢?
[[UINavigationBar类]respondsToSelector:@selector(外观)]
可以写成
[UINavigationBar respondsToSelector:@selector(外观)]