Действительно ли возможно условно использовать функции iOS 6, но все еще поддержать более старые устройства?

Иногда есть опции, добавленные в новых версиях iOS, которые заманчивы для использования, но вы не хотите предотвращать пользователей на более старых устройствах от использования приложения только из-за одной незначительной особенности.

Я только что добавил UIRefreshControl к приложению, которое было добавлено в iOS 6. Я действительно не забочусь достаточно, чтобы использовать решение других производителей (которых есть число), я был бы точно так же, как, чтобы не призвать код, который настраивает его, если я работаю на более старом устройстве. Я подозреваю, будучи статическим языком, это не возможно, но я думал, что буду спрашивать и видеть, есть ли способы достигнуть этого.

Очевидно, если бы я просто разделял код, то я мог бы сделать это с макросом препроцессора, но я должен построить приложение, чтобы выполнить на iOS 5.1 + iOS 6.0.

1
nl ja de

1 ответы

Это совершенно возможно, просто проверьте, доступен ли класс:

if ([UIRefreshControl class]) {
  //the UIRefreshControl is available.
}

Это то же самое с новым методом на существующих классах:

if ([self.someLabel  respondsToSelector:@selector(setAttributedText:)]) {
   //The label support attributed strings
}

Цель-c не статическое, как вы могли бы думать, просто быть уверены, что вы слабая связь любые структуры, которые не доступны в более ранних версиях iOS.

5
добавлено
Ничего себе, просто, ничего себе. У меня просто был один из тех, "о, как прохладные" моменты, как я думал о том, как код ObjC переведен на вызовы функции C во время выполнения ObjC. Это сладко.
добавлено автор d11wtq, источник