objective-c - 修复 "Use of undeclared identifier ' NSPreferencePanesDirectory'"

标签 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 或者只是手动指定首选项 Pane 目录的位置。

我应该更改什么才能停止出现“使用未声明的标识符”错误?

谢谢。

最佳答案

#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;

(未测试)

关于objective-c - 修复 "Use of undeclared identifier ' NSPreferencePanesDirectory'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9017353/

相关文章:

iphone - 以编程方式获取结合 OpenGL 和 UIKit 元素的屏幕截图

objective-c - 调整 NSTextView 中 NSImage 的大小

macos - 禁用 NSTask 截图声音

java - 在 Mac OS X Mavericks 上使用 Maven 插件启动 Google Appengine devserver 时出现延迟

php - 在不同于 Ubuntu/Windows 的 Mac 上运行 PHP & MySQL

cocoa - 使用可变数组检索保存到 NSUserDefaults 的数组并更改值

objective-c - Obj-C/Cocoa : Use of Shortcut Recorder Framework, 怎么办?

ios - 如何在 Objective-C 中为 pin mapview 中的文本添加事件处理程序?

objective-c - 在本地模式与管理模式下编写 plist 时出现问题

macos - 如何在 OSX 上检测当前系统光标?