Подтвердить что ты не робот

Как поддерживать NSCalendar с iOS 7 и 8?

В iOS 8 были введены новые значения для старых методов. Например, создание такого календаря будет таким:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

Теперь изменился идентификатор календаря, и я должен создать объект следующим образом:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

Thing is, компилятор предупреждает меня только в первой ситуации, когда NSGregorianCalendar устарел. Однако компилятор вообще не предупреждает меня о совместимости NSCalendarIdentifierGregorian с iOS 7.
Означает ли это, что NSCalendarIdentifierGregorian работает под iOS 7 либо?
Если нет, то каков наилучший способ создания календаря с идентификатором календаря в зависимости от ОС? проверка версии ОС каждый раз кажется утомительной.

Спасибо.

4b9b3361

Ответ 1

Вы можете использовать встроенный макрос __IPHONE_8_0 в сочетании с пользовательскими настройками.

Ваши пользовательские определения будут просто ссылаться на базовое значение, определенное в Objective-C. Поскольку это удобные определения, которые широко используются, я вставляю их в заголовочный файл и включаю его в мой PCH файл (в Xcode 6 вы должны сами создать заголовок предварительного компилятора и указать его в своих настройках сборки).

Когда выйдет iOS 9, вы по-прежнему сможете использовать __IPHONE_8_0 без обновления, поскольку он все равно будет определен для всех версий после iOS 8.

В файле заголовка (или заголовке предварительного компилятора - project_name.pch)

#ifdef __IPHONE_8_0
    #define GregorianCalendar NSCalendarIdentifierGregorian
#else
    #define GregorianCalendar NSGregorianCalendar
#endif

В ваших файлах реализации

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:GregorianCalendar];

Ответ 2

Я знаю, что вы спросили о григорианцах конкретно, но не всегда ли это было бы предпочтительным:

NSCalendar *calendar = [NSCalendar currentCalendar];