Как поддерживать 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 либо?
Если нет, то каков наилучший способ создания календаря с идентификатором календаря в зависимости от ОС? проверка версии ОС каждый раз кажется утомительной.
Спасибо.
Ответы
Ответ 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];