Создавать подклассы UIRfreshControl, но по-прежнему поддерживать iOS 5.1?

Добавил UIRefreshControl в одно из моих табличных представлений здесь и просто использовал responsesToSelector в контроллере табличного представления, чтобы увидеть, имеет ли он свойство refreshControl перед настройкой и добавлением UIRefreshControl с помощью NSClassFromString(). Работает отлично, и я могу продолжать поддерживать iOS 5.1 (только без нового элемента управления).

Однако… я хочу переопределить методы beginRefreshing и endRefreshing для динамического изменения цвета оттенка элемента управления. И я подумал, что создание подкласса UIRefreshControl будет самым простым способом сделать это. Но как мне это сделать и при этом поддерживать iOS 5.1?


person Christian A. Strømmen    schedule 23.10.2012    source источник


Ответы (1)


На самом деле, предполагая, что ваш базовый SDK — это как минимум iOS 6.0, вы можете создать подкласс UIRefreshControl, если целью развертывания является iOS 3.1 или более поздняя версия. Это связано с тем, что в iOS 3.1 была добавлена ​​поддержка слабосвязанных классов.

Со слабосвязанными классами, если вы отправляете сообщение классу, которого нет в работающей ОС, это то же самое, что и нулевой обмен сообщениями. Таким образом, вместо использования NSClassFromString() вы можете просто сделать это:

if ([UIRefreshControl class]) {
    // Use it
}
else {
    // Do something else 
}

Это работает даже при обмене сообщениями с вашим собственным подклассом слабосвязанного класса. Согласно "Руководству по совместимости SDK" говорит,

Если вы создаете подкласс слабосвязанного класса, а надкласс недоступен, то подкласс также оказывается недоступным.

Итак, вы можете просто сделать это:

if ([MyRefreshControl class]) {
    MyRefreshControl *control = [[MyRefreshControl alloc] init];
    // Do something with the control
}
else {
    // Do something else 
}

Это будет работать на устройствах с iOS 5.1 точно так же, как и на устройствах с iOS 6. Ваша проблема решена.

person BJ Homer    schedule 08.11.2012