基于操作系统版本的条件方法

时间:2011-08-23 17:59:56

标签: objective-c cocoa nsdateformatter

我确信这很简单,但我不确定如何搜索它,因为我已经看到了我认为被称为编译器标志的例子?但是一般来说什么是可可的最佳方法在支持它的操作系统版本上运行特定方法。例如,NSDateFormatter类具有setDoesRelativeDateFormatting方法,该方法仅适用于10.6(在Mac上)及更高版本。

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];        
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

    [dateFormatter setLocale:enLocale];
    [dateFormatter setDoesRelativeDateFormatting:YES];

2 个答案:

答案 0 :(得分:1)

以下是Adium如何检测到它在Snow Leopard上运行或更好地执行此类操作(这是NSApplication中的类别):

//Make sure the version number defines exist; when compiling in 10.5, NSAppKitVersionNumber10_5 isn't defined 
#ifndef NSAppKitVersionNumber10_5
#define NSAppKitVersionNumber10_5 949
#endif 

- (BOOL)isOnSnowLeopardOrBetter
{
    return (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5);
}

然后你所要做的就是

if ([NSApp isOnSnowLeopardOrBetter]) { ... }

您可以通过命令单击NSAppKitVersionNumber来查找AppKit的版本号,以跳转到其定义。

答案 1 :(得分:0)

对于这种特殊情况,应该很容易做到以下几点:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];        
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSLocale *enLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

[dateFormatter setLocale:enLocale];

if ([dateFormatter respondsToSelector:@selector(setDoesRelativeDateFormatting:)]) {
    [dateFormatter setDoesRelativeDateFormatting:YES];
}

有关详细信息,请参阅NSObject协议-respondsToSelector: