修复“使用未声明的标识符'NSPreferencePanesDirectory'”

时间:2012-01-26 11:17:06

标签: objective-c macos cocoa

我的应用使用following code

#if MAC_OS_X_VERSION_10_5 < MAC_OS_X_VERSION_MAX_ALLOWED
    NSArray *globalPreferencePanes = 
        NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory,
            NSAllDomainsMask, YES);        
#else
    NSArray *globalPreferencePanes = 
        [NSArray arrayWithObjects:@"/Library/PreferencePanes", 
            [@"~/Library/PreferencePanes" stringByExpandingTildeInPath], nil];
#endif
return globalPreferencePanes;

我正在编译它的项目针对的是10.5 Mac OSX SDK,其中NSPreferencePanesDirectory不存在(它只存在于10.6+中)。因此,我有#if#else以检查我们正在运行的Mac OSX的版本,因此我知道是应该使用NSPreferencePanesDirectory还是只是手动给出首选项窗格目录的位置。

为了停止使用“未声明的标识符”错误,我应该更改什么?

感谢。

2 个答案:

答案 0 :(得分:3)

#if在编译时评估,而不是运行时。您可能想要做的是使用当前的SDK(10.7),并执行以下操作:

NSArray *globalPreferencePanes;

if (NSAppKitVersionNumber >= NSAppKitVersionNumber10_6)
    globalPreferencePanes = NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSAllDomainsMask, YES);        
else
    globalPreferencePanes = [NSArray arrayWithObjects:@"/Library/PreferencePanes", [@"~/Library/PreferencePanes" stringByExpandingTildeInPath], nil];

    return globalPreferencePanes;

确保将目标操作系统版本设置为10.5,以便符号弱链接。否则,您可以下拉并使用CoreServices'FSFindFolder()

NSMutableArray *globalPreferencePanes = [NSMutableArray array];
FSRef foundRef;

OSErr err = FSFindFolder(kLocalDomain, kPreferencePanesFolderType, false, &foundRef);

if (err != noErr) {
    CFURLRef url = CFURLCreateFromFSRef(NULL, &fsRef);
    CFStringRef path = CFURLCopyPath(url);
    [globalPreferencePanes addObject:(id)path];
    CFRelease(path);
    CFRelease(url);
}

OSErr err = FSFindFolder(kUserDomain, kPreferencePanesFolderType, false, &foundRef);

if (err != noErr) {
    CFURLRef url = CFURLCreateFromFSRef(NULL, &fsRef);
    CFStringRef path = CFURLCopyPath(url);
    [globalPreferencePanes addObject:(id)path];
    CFRelease(path);
    CFRelease(url);
}

return globalPreferencePanes;

(未经测试)

答案 1 :(得分:0)

如果您使用的是10.5.x,那么您仍然会收到错误,因为&#34; NSPreferencePanesDirectory&#34;不是一个已知的符号。我为朋友解决了这个问题,并将osxsupport.m中的FindPrefsDir函数代码更改为:

char *FindPrefsDir(void)
{
    char *resstr = NULL;
    NSArray *globalPreferencePanes;

    globalPreferencePanes = [NSArray arrayWithObjects:@"/Library/PreferencePanes", [@"~/Library/PreferencePanes" stringByExpandingTildeInPath], nil];

    if ([globalPreferencePanes count] > 0)
    {
        resstr = StringToChar([globalPreferencePanes objectAtIndex:0]) ;
    }
    return resstr;

}

感谢Wevah的代码建议,但它并没有直接为我工作。所以我稍微改了一下,我的朋友仍然在10.5.x之后可以完美地构建它。