【问题标题】:Compiling an app that works in iOS 6 and iOS 7编译适用于 iOS 6 和 iOS 7 的应用程序
【发布时间】:2013-10-01 07:37:32
【问题描述】:

我正在努力编译一个用于 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 Deployment Target 设置为iOS 6.0。我对该项目进行了清理。

代码如下:

在.h文件中:

@property (nonatomic, strong) IBOutlet UITabBar *tabbedBar;

.m 文件中:

if ([tabbedBar respondsToSelector: @selector(barTintColor)]) {
     tabbedBar.barTintColor = [UIColor blackColor];
}

我正在针对 iOS 7 SDK 进行编译,因此它应该了解 barTintColor。知道可能是什么问题吗?

更新:

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

查看此 Xcode 屏幕截图。请注意我的 iPad 3 在 Active Scheme 选择中的两个条目。有什么区别?如果我选择顶部选项,我会收到错误消息。如果我选择底部选项,它会起作用。

谁能解释为什么同一个设备在这个列表中出现两次,为什么当我选择一个而不是另一个时它会起作用?仅供参考,该设备已安装 iOS 6。

【问题讨论】:

  • 这是运行时错误还是编译错误?你可以试试@selector(setBarTintColor:)吗?
  • 你试过选择器 setBarTintColor: 吗?如 [tabbedBar setBarTintColor:[UIColor blackColor]];
  • 抱歉,Xcode 也不知道setBarTintColor。看到这个截图link
  • 你做错了。也许清理项目或退出 Xcode 并再次运行?我设置了Latest iOS 7 SDKTarget to 6.0,它对我有用。如前所述,在@selector() 中,您必须输入setBarTintColor:
  • 嗯。我看到我插入的 iOS 设备在 Xcode 5 中也列出了两次。我只是把它归结为 Xcode,因此我期待这种事情。

标签: ios xcode ipad uikit ios7


【解决方案1】:

您的 Xcode 中安装了两个 SDK:适用于 iOS 6 和 iOS 7。现在,如果您插入 iOS 7 设备,它会在设备选择器中显示为两个设备(即选项):第一行是 iPad 3 (iOS 6),其次是 iPad 3 (iOS 7)。

您的错误问题在于,当您选择 iPad 3 (iOS 6) 时,Xcode 仍将设备读取为 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 或 Enterprise Distribution 时,您只需构建一个版本。不是每个 SDK 都有一个。
  • 是的,但我说的只是在 iPad 上运行。当您归档应用程序时,它在 iOS 6 和 7 上都能正常运行。您可以尝试通过 TestFlight/HockeyApp 进行归档和分发,不会有任何问题。
  • 所以Xcode在测试时编译的是特定的SDK版本,而不是通用的二进制文件?
  • 不知道是不是这样。无论如何,它现在检查不可用的 API 调用(4.x 没有这样做),并且由于有一个代码路径导致 iOS 7 选择器(并且您正在构建以在 iOS 6 上运行)它引发一个错误。这通常是一件好事,但可能会令人困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
相关资源
最近更新 更多