如何同时支持 iOS 7 和 8 的 NSCalendar?
Posted
技术标签:
【中文标题】如何同时支持 iOS 7 和 8 的 NSCalendar?【英文标题】:How to support NSCalendar with both iOS 7 and 8? 【发布时间】:2014-09-02 15:15:28 【问题描述】:ios 8 为旧方法引入了一些新值。 例如,以前创建日历是这样的:
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
现在,日历标识符已更改,我应该像这样创建对象:
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
问题是,编译器仅在不推荐使用 NSGregorianCalendar 的第一种情况下警告我。但是,编译器根本没有警告我 NSCalendarIdentifierGregorian 与 iOS 7 的兼容性。这是否意味着 NSCalendarIdentifierGregorian 也可以在 iOS 7 下工作? 如果没有,根据操作系统创建具有日历标识符的日历的最佳方法是什么?每次检查操作系统版本似乎很乏味。 谢谢。
【问题讨论】:
如果你的部署目标是 iOS 7,那么使用NSGregorianCalendar
。它在 iOS 7 和 iOS 8 下都可以正常工作,并且您不会收到任何弃用警告。
@rmaddy 为什么不在答案中发表您的评论?
【参考方案1】:
您可以使用内置的__IPHONE_8_0
宏,再加上自定义定义。
您的自定义定义将简单地引用在 Objective-C 中定义的基础值。由于这些是广泛使用的便利定义,我将它们粘贴到头文件中,并将其包含在我的 PCH 文件中(在 Xcode 6 中,您必须自己创建预编译器头,并在构建设置中指向它) .
当 iOS 9 发布时,您仍然可以使用 __IPHONE_8_0
而无需更新,因为它仍将被定义,适用于 iOS 8 之后的所有版本。
在头文件中(或 Precompiler Header - project_name.pch)
#ifdef __IPHONE_8_0
#define GregorianCalendar NSCalendarIdentifierGregorian
#else
#define GregorianCalendar NSGregorianCalendar
#endif
在你的实现文件中
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:GregorianCalendar];
【讨论】:
NSCalendarIdentifierGregorian NS_AVAILABLE(10_6, 4_0)
。为什么不在这两种情况下都使用这个const
?
将 NSCalendarIdentifierGregorian 与 xCode 5 一起使用并使用 iOS 7.1 编译,会产生此编译器错误:'NSCalendarIdentifierGregorian' is unavailable: not available on iOS
。根据我的回答中的定义,GregorianCalendar
等同于 xCode 5 和 6 上的“gregorian”。我认为这在与开发人员团队合作时最有用,其中一些人仍在使用 xCode 5 进行开发。
能否保证 const 在 SDK 的未来版本中仍会解析为“gregorian”?
回答你的问题,@Gabriel,在这一点上,这些常量似乎不太可能很快被重命名。但是,如果它们是,__IPHONE_8_0 仍将被定义,因为它保证在 iOS 8 期间和之后的所有版本中都被定义。【参考方案2】:
我知道您专门询问了公历,但无论如何使用它并不总是更可取:
NSCalendar *calendar = [NSCalendar currentCalendar];
【讨论】:
有时您必须只使用NSGregorianCalendar
,例如当使用 set startDateComponents
和 dueDateComponents
for EKReminder
以上是关于如何同时支持 iOS 7 和 8 的 NSCalendar?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 13.6 / 12.4.8 正式版来了,依然支持越狱