ios - 如何同时支持 iOS 7 和 8 的 NSCalendar?

标签 ios objective-c ios8

iOS 8 为旧方法引入了一些新值。 例如,创建一个日历曾经是这样的:

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

现在,日历标识符已更改,我应该像这样创建对象:

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

问题是,编译器仅在第一种情况下警告我 NSGregorianCalendar 已被弃用。但是,编译器根本没有警告我 NSCalendarIdentifierGregorian 与 iOS 7 的兼容性。
这是否意味着 NSCalendarIdentifierGregorian 也可以在 iOS 7 下工作?
如果没有,根据操作系统创建带有日历标识符的日历的最佳方法是什么?每次检查操作系统版本似乎很乏味。

谢谢。

最佳答案

您可以使用内置的 __IPHONE_8_0 宏以及自定义定义。

您的自定义定义将仅引用 Objective-C 中定义的基础值。由于这些是广泛使用的便利定义,我将它们粘贴到头文件中,并将其包含在我的 PCH 文件中(在 Xcode 6 中,您必须自己创建预编译器头文件,并在build设置中指向它) .

当 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];

关于ios - 如何同时支持 iOS 7 和 8 的 NSCalendar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626823/

相关文章:

ios - 如何对多个 NSProgress 使用 observeValueForKeyPath?

objective-c - 在 iOS 中绘制 1 像素宽的路径

ios - 没有在图像集中添加横向图像的选项

ios - 在 iOS 8 中以编程方式安装配置文件

iphone - NSUserDefaults EXC_BAD_ACCESS

web-applications - iPhone Web App - 在 iOS8 中停止 body 弹跳/滚动

iphone - 如何相对于用户握持设备的方式绕 Y 轴旋转?

ios - 初始化程序和函数中的参数之间的 Swift 语法差异

ios - 创建类似于 Facebook News Feed 的 UI 的建议方法是什么?

objective-c - Objective-C 垃圾收集打开时 xml 元素插入错误