【问题标题】:What should I do to adapt my app to iOS 5.0 keeping compatibility with iOS 4我应该怎么做才能使我的应用程序适应 iOS 5.0 以保持与 iOS 4 的兼容性
【发布时间】:2011-10-14 19:06:00
【问题描述】:

我今天开始玩 iOS 5,我发现 XCode 4.2 只让我选择 iOS 5 作为 Base SDK 而不是 iOS 4。

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

谢谢,

爱丽儿

【问题讨论】:

    标签: iphone objective-c ios ios5


    【解决方案1】:

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

    处理第二个问题的正确方法是测试能力,而不是版本。所以,这样的事情可以说是你的application: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];
    }
    

    然后您将针对 iOS5 SDK 进行编译,因此使用 appearance 完全可以。但是这个编译后的代码在iOS 5之前的版本上运行就可以了。

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

    【讨论】:

    • [[UINavigationBar class] respondsToSelector:@selector(appearance)]可以写成[UINavigationBar respondsToSelector:@selector(appearance)]
    【解决方案2】:

    另一种自定义标题的方法是这样的。

    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可以知道函数是否在这里。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您不能使用宏来执行此操作,因为两个代码路径都必须到位,并且正确的路径取决于运行时检查。

        Soooo...使用这样的东西:

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

        要获取您当前正在运行的 iOS 版本并在 5 及更高版本下执行 [UINavigationBar 外观],您可以回退到 iOS 4 上的 drawRect 东西。

        【讨论】:

        • 这是个坏主意。从技术上讲,大多数情况下使用操作系统版本都可以,但这不是一个可靠的解决方案。假设 tintColor 在 iOS 5 中被添加 UIBarButtonItem,在 iOS 6 中被弃用并在 iOS 7 中被删除。使用 iOS 5 版本安装的应用程序将在假设的 iOS 7 中停止正常工作。当然,您可以随着时间的推移发布更新,添加额外的条件和复杂性,但为什么不直接使用 -[respondsToSelector:] 而不必担心过去或未来??
        【解决方案5】:

        还可以下载适用于 iPhone 和 iPad 的 4.3 模拟器。然后当你不小心在 4.3 上使用 iOS 5 的东西时,你可以更快地崩溃 --汤姆

        【讨论】:

        • 他们曾经支持安装多个 SDK,但我想现在已经不存在了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 1970-01-01
        • 2011-03-01
        • 2021-11-03
        • 2021-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多