2015-05-05 3 views
-1

Мне было интересно, возможно ли это/как можно кодировать класс, чтобы он мог запускаться на разных версиях iOS в Objective-C. Например, VisualEffectView доступен только в iOS8 и после. Можно ли объявить VisualEffectView, если iOS> = 8 и UIView, если нет? Если это можно сделать в файле заголовка?Objective-C: Кодирование для различных версий iOS

Я хочу создать окно предупреждения, которое появится поверх контроллера вида, когда закончится сохранение или произойдет ошибка. В зависимости от версии iOS было бы неплохо, если бы использовалось необычное размытое представление или просто плоский UIView.

+0

На каких языках вы программируете? Это имеет большое значение. – matt

+2

Вам необходимо прочитать [Руководство по совместимости SDK] (https://developer.apple.com/library/prerelease/ios/documentation/DeveloperTools/Conceptual/cross_development/Introduction/Introduction.html). – rmaddy

+1

@matt ОП упоминает «файл заголовка», поэтому я предполагаю Objective-C. – rmaddy

ответ

1

В заявлении if используйте NSClassFromString. Вы обнаружите, что сразу UIVisualEffectView не существует, когда он возвращается nil, и, таким образом, вы можете взять одну ветвь, если она существует и другой, если он не делает:

if (!NSClassFromString(@"UIVisualEffectView")) { 
    // ... use UIView ... 
} else { 
    // ... use UIViewVisualEffectView ... { 
} 
+1

И для более обширного списка условных методов кодирования для обратной совместимости см. Мою книгу: http://www.apeth.com/iOSBook/ch09.html#_device_architecture_and_conditional_code – matt

1

С прошивкой 5 вы можете следующий синтаксис ,

if ([UIVisualEffectView class]) { 
    // Create and use a UIVisualEffectView 
} 

Это иногда укусить вас, NSMapTable доступен в версиях IOS до IOS 6, но только «официально» доступен в прошивке 6. При попытке использовать его в прошивке 5 было некоторое спорадическое недокументированное поведение.

+0

Не будет ли это сбой на устройстве iOS 7, потому что оно не работает У вас есть класс UIVisualEffectView? – rounak

+0

Нет, использование этого синтаксиса безопасно для проверки доступности класса в iOS 5 и выше. –

0

Как многие из них предложили, вы можете использовать функцию NSClassFromString, чтобы узнать ее во время выполнения, если версия ОС имеет класс. Если нет (это устройства iOS 7), и вы все еще хотите жить размытым, я бы рекомендовал LiveFrost.