Компиляция приложения, работающего в iOS 6 и iOS 7

Я пытаюсь скомпилировать приложение iPad для использования на iOS 6 и iOS 7.

Вот сообщение, которое я получаю:

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. Я сделал "Чистый" в проекте.

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. Обратите внимание на две записи для моего iPad 3 в разделе "Активная схема". В чем разница? Если я выберу верхний вариант, я получу ошибку. Если я выберу нижний параметр, он будет работать.

Xcode device selection

Может ли кто-нибудь объяснить, почему одно и то же устройство дважды появляется в этом списке и почему оно работает, когда я выбираю один, а не другой? FYI, устройство имеет iOS 6.

Ответ 1

У вас есть два SDK, установленных в вашем Xcode: для 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, в то же время он вызывает ошибку: "потому что hey, iOS 6 не имеет этого метода! Fun.

В принципе, вы не можете использовать параметр iOS 6 при тестировании на устройстве iOS 7. Вам либо требуется устройство iOS 6, либо вы застряли с симулятором для тестирования старых версий.

EDIT: вы можете проверить, что я говорю, следующим образом - вместо использования respondsToSelector: используйте

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) {
    // code
}

а затем выберите первое устройство в списке (iPad 3 iOS 6). Вы увидите, что вы проходите через предложение if, но Xcode дает вам ошибку, что селектор недоступен на iOS 6.