编译适用于iOS 6和iOS 7的应用程序

11

我正在努力编译一款可在iOS 6和iOS 7上使用的iPad应用程序。

这是我不断收到的信息:

Property 'barTintColor' not found on object of type 'UITabBar *'; did you mean 'tintColor'?

目标的Base SDK设置为Latest iOS (iOS 7.0),而是iOS 6.0。我对项目进行了清理操作。

Xcode Target Settings

以下是代码:

在.h文件中:

@property (nonatomic, strong) IBOutlet UITabBar *tabbedBar;
在 .m 文件中:
if ([tabbedBar respondsToSelector: @selector(barTintColor)]) {
     tabbedBar.barTintColor = [UIColor blackColor];
}

我正在使用iOS 7 SDK编译,所以它应该知道barTintColor。 有什么问题吗?

更新:

好的,我正在取得进展,但还不太明白为什么。

请看这张Xcode屏幕截图。 注意Active Scheme选择中我的iPad 3的两个条目。 有什么区别? 如果我选择顶部选项,就会出现错误。 如果我选择底部选项,就可以正常工作。

Xcode设备选择

是否有人能解释为什么同一设备在此列表中出现两次,以及为什么选择其中一个可以正常工作而选择另一个则不行? FYI,设备安装了iOS 6。


那是运行时错误还是编译错误?你可以尝试使用@selector(setBarTintColor:)吗? - Brian Nickel
你尝试过使用选择器 setBarTintColor: 吗?就像这样 [tabbedBar setBarTintColor:[UIColor blackColor]]; - CSmith
抱歉,Xcode也不知道setBarTintColor这个方法。请参考这张截图[链接](http://i.imgur.com/kN0Qu7N.png)。 - Axeva
1
你做错了什么。也许可以尝试清理项目或退出Xcode并重新运行?我已经设置了“最新的iOS 7 SDK”和“目标为6.0”,这对我来说是有效的。在@selector()中,你必须像之前提到的那样输入setBarTintColor: - Tomasz Szulc
这里有些不对劲。如果我退出Xcode,重新启动,清理应用程序,然后在iOS 7 iPad上运行,就没问题了。尝试在iOS 6 iPad上执行相同的例程,我会得到错误。我不明白... - Axeva
1
嗯,我在Xcode 5中也看到我的iOS设备被列了两次。我只是认为这是Xcode的问题,所以我对这种情况有所期望。 - Ben Clayton
1个回答

15
你在Xcode中安装了两个SDK:iOS 6和iOS 7。现在,当你连接iOS 7设备时,在设备选择器中会显示两个设备选项(即第一行为iPad 3(iOS 6),第二行为iPad 3(iOS 7))。
你错误的问题在于,当你选择iPad 3(iOS 6)时,Xcode仍然将设备识别为iOS 7(反正它已经安装了iOS 7),因此编译时会通过[tabbedBar respondsToSelector:@selector(barTintColor)]代码(因为它是iOS 7,可以响应该选择器),但由于你正在构建iOS 6版本,所以同时会产生错误,因为iOS 6没有该方法!简直太有趣了。
基本上,当在iOS 7设备上测试旧版时,你不能使用iOS 6选项。你需要一个iOS 6设备,或者只能使用模拟器进行测试。
编辑:你可以通过以下方式测试我所说的话 - 不要使用respondsToSelector:,而是使用
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) {
    // code
}

然后在列表中选择第一个设备(iPad 3 iOS 6)。您会发现,您经历了 if 子句,但是 Xcode 给出了一个错误,指出该选择器在 iOS 6 上不可用。


我不确定。无论设备是iOS 6还是iOS 7,都应该创建一个二进制文件吧?当您发布到App Store或企业分发时,只需构建一个版本,而不是每个SDK都需要构建一个版本。 - Axeva
是的,但我只是在谈论在iPad上运行。当您存档应用程序时,它可以在iOS 6和7上正常工作。您可以尝试制作一个存档,并通过TestFlight / HockeyApp进行分发,您不会遇到问题。 - nikolovski
2
那么在测试时,Xcode会编译特定的SDK版本,而不是通用二进制文件? - Axeva
我不知道是否是这种情况。无论如何,现在它检查不可用的API调用(4.x没有这样做),并且由于存在导致iOS 7选择器的代码路径(而您正在构建以在iOS 6上运行),因此会引发错误。这通常是一件好事,但可能会令人困惑。 - nikolovski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接